{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#  依赖安装和导入"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {
    "execution": {
     "iopub.execute_input": "2025-01-01T03:12:27.775455Z",
     "iopub.status.busy": "2025-01-01T03:12:27.775173Z",
     "iopub.status.idle": "2025-01-01T03:12:32.130912Z",
     "shell.execute_reply": "2025-01-01T03:12:32.130109Z",
     "shell.execute_reply.started": "2025-01-01T03:12:27.775405Z"
    },
    "trusted": true
   },
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "ERROR: Can not perform a '--user' install. User site-packages are not visible in this virtualenv.\n"
     ]
    }
   ],
   "source": [
    "!pip install imblearn --user"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "* sklearn(scikit-learn)：提供机器学习工具和模型。Kaggle自有。\n",
    "* imblearn：用于处理不平衡数据集，包含 SMOTE（一种上采样方法）。\n",
    "    * SMOTE 合成少数过采样技术\n",
    "    * 上采样是处理不平衡数据集的技术之一，目的是通过增加少数类的样本数量来平衡类别分布。常见的上采样方法包括：\n",
    "        1. **随机过采样**：随机复制少数类样本。\n",
    "        2. **SMOTE**：在少数类样本之间插值生成新样本。\n",
    "        3. **ADASYN**：SMOTE的改进版本，对类别不平衡更严重的类别生成更多样本。\n",
    "        4. **KMeans SMOTE**：使用KMeans聚类来确定少数类的哪些样本需要生成新样本。\n",
    "        5. **Borderline-SMOTE**：仅对边界样本生成新样本，以减少过拟合。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {
    "execution": {
     "iopub.execute_input": "2025-01-01T03:12:32.132159Z",
     "iopub.status.busy": "2025-01-01T03:12:32.131923Z",
     "iopub.status.idle": "2025-01-01T03:12:33.076173Z",
     "shell.execute_reply": "2025-01-01T03:12:33.075292Z",
     "shell.execute_reply.started": "2025-01-01T03:12:32.132140Z"
    },
    "trusted": true
   },
   "outputs": [],
   "source": [
    "# 导入标准库\n",
    "import os\n",
    "import math\n",
    "import time\n",
    "import random\n",
    "import datetime\n",
    "# 导入科学计算与数据分析库\n",
    "import numpy as np\n",
    "import pandas as pd\n",
    "# 导入可视化工具\n",
    "import seaborn as sns\n",
    "import matplotlib.pyplot as plt"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "* os：提供操作系统相关功能，比如文件路径管理。\n",
    "* math：提供数学函数，比如平方根、对数等。\n",
    "* time：进行时间相关操作，比如获取当前时间或计算程序运行时间。\n",
    "* random：生成随机数，用于数据处理和增强。\n",
    "* datetime：处理日期和时间，常用于时间戳记录。\n",
    "* numpy：用于处理多维数组和矩阵计算，高效的数值操作库。\n",
    "* pandas：用于数据加载、清洗、操作和分析，主要是 DataFrame 格式的表格数据。\n",
    "* seaborn：高级可视化库，基于 matplotlib，用于绘制美观的数据统计图表。\n",
    "* matplotlib.pyplot：底层绘图库，提供绘制图形的基础功能。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {
    "execution": {
     "iopub.execute_input": "2025-01-01T03:12:33.077603Z",
     "iopub.status.busy": "2025-01-01T03:12:33.077197Z",
     "iopub.status.idle": "2025-01-01T03:12:40.247045Z",
     "shell.execute_reply": "2025-01-01T03:12:40.246109Z",
     "shell.execute_reply.started": "2025-01-01T03:12:33.077573Z"
    },
    "trusted": true
   },
   "outputs": [],
   "source": [
    "# 导入 TensorFlow 及其相关模块\n",
    "import tensorflow as tf\n",
    "import tensorflow.keras as K\n",
    "from tensorflow.keras import Sequential, utils, regularizers, Model, Input\n",
    "from tensorflow.keras.layers import Flatten, Dense, Conv1D, MaxPool1D, Dropout, AvgPool1D"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "* tensorflow：一个用于深度学习的框架，支持构建和训练神经网络。\n",
    "* keras：TensorFlow 的高级 API，用于快速定义和训练深度学习模型。\n",
    "* 导入的具体模块和类：\n",
    "  * Sequential：一种简单的模型构建方式，按顺序堆叠层。\n",
    "  * utils：工具模块，如模型保存和加载等。\n",
    "  * regularizers：正则化模块，用于减轻模型过拟合。\n",
    "  * Model 和 Input：用于构建自定义模型（比 Sequential 更灵活）。\n",
    "  * Flatten：将多维张量展平成一维张量。\n",
    "  * Dense：全连接层。\n",
    "  * Conv1D：一维卷积层，用于处理序列数据（如时间序列）。\n",
    "  * MaxPool1D：一维最大池化层，用于降维。\n",
    "  * Dropout：正则化方法，随机丢弃一部分神经元以减轻过拟合。\n",
    "  * AvgPool1D：一维平均池化层。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {
    "execution": {
     "iopub.execute_input": "2025-01-01T03:12:40.248591Z",
     "iopub.status.busy": "2025-01-01T03:12:40.247972Z",
     "iopub.status.idle": "2025-01-01T03:12:40.823459Z",
     "shell.execute_reply": "2025-01-01T03:12:40.822823Z",
     "shell.execute_reply.started": "2025-01-01T03:12:40.248560Z"
    },
    "trusted": true
   },
   "outputs": [],
   "source": [
    "# 导入不平衡数据处理工具\n",
    "from imblearn.over_sampling import SMOTE\n",
    "from sklearn.model_selection import KFold\n",
    "from sklearn.preprocessing import OneHotEncoder"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "* SMOTE（Synthetic Minority Oversampling Technique）\n",
    "* KFold：交叉验证工具，将数据分成 K 个子集，循环训练和验证。\n",
    "* OneHotEncoder：将分类标签（如 0、1、2）编码成独热编码形式（如 [1,0,0]）。"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 数据加载与预处理"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 加载数据"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {
    "execution": {
     "iopub.execute_input": "2025-01-01T03:12:40.824558Z",
     "iopub.status.busy": "2025-01-01T03:12:40.824145Z",
     "iopub.status.idle": "2025-01-01T03:12:46.222783Z",
     "shell.execute_reply": "2025-01-01T03:12:46.221852Z",
     "shell.execute_reply.started": "2025-01-01T03:12:40.824537Z"
    },
    "trusted": true
   },
   "outputs": [],
   "source": [
    "# 加载训练集和测试集(相对路径)\n",
    "train = pd.read_csv('train.csv')  \n",
    "test = pd.read_csv('testA.csv')  "
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 定义数据精度量化压缩函数"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {
    "execution": {
     "iopub.execute_input": "2025-01-01T03:12:46.225702Z",
     "iopub.status.busy": "2025-01-01T03:12:46.225447Z",
     "iopub.status.idle": "2025-01-01T03:12:46.234412Z",
     "shell.execute_reply": "2025-01-01T03:12:46.233600Z",
     "shell.execute_reply.started": "2025-01-01T03:12:46.225679Z"
    },
    "trusted": true
   },
   "outputs": [],
   "source": [
    "# 数据精度量化压缩\n",
    "def reduce_mem_usage(df):\n",
    "    # 优化前的数据集内存大小\n",
    "    start_mem = df.memory_usage().sum() / 1024**2 \n",
    "    print('优化前的数据集内存大小 {:.2f} MB'.format(start_mem))\n",
    "    \n",
    "    # 遍历特征列\n",
    "    for col in df.columns:\n",
    "        # 当前特征类型\n",
    "        col_type = df[col].dtype\n",
    "        # 处理 numeric 型数据\n",
    "        if col_type != object:\n",
    "            c_min = df[col].min()  # 最小值\n",
    "            c_max = df[col].max()  # 最大值\n",
    "            # int 型数据 精度转换\n",
    "            if str(col_type)[:3] == 'int':\n",
    "                if c_min > np.iinfo(np.int8).min and c_max < np.iinfo(np.int8).max:\n",
    "                    df[col] = df[col].astype(np.int8)\n",
    "                elif c_min > np.iinfo(np.int16).min and c_max < np.iinfo(np.int16).max:\n",
    "                    df[col] = df[col].astype(np.int16)\n",
    "                elif c_min > np.iinfo(np.int32).min and c_max < np.iinfo(np.int32).max:\n",
    "                    df[col] = df[col].astype(np.int32)\n",
    "                elif c_min > np.iinfo(np.int64).min and c_max < np.iinfo(np.int64).max:\n",
    "                    df[col] = df[col].astype(np.int64)  \n",
    "            # float 型数据 精度转换\n",
    "            else:\n",
    "                if c_min > np.finfo(np.float16).min and c_max < np.finfo(np.float16).max:\n",
    "                    df[col] = df[col].astype(np.float16)\n",
    "                elif c_min > np.finfo(np.float32).min and c_max < np.finfo(np.float32).max:\n",
    "                    df[col] = df[col].astype(np.float32)\n",
    "                else:\n",
    "                    df[col] = df[col].astype(np.float64)\n",
    "        # 处理 object 型数据\n",
    "        else:\n",
    "            df[col] = df[col].astype('category')  # object 转 category\n",
    "    \n",
    "    # 处理后 数据集总内存计算\n",
    "    end_mem = df.memory_usage().sum() / 1024**2 \n",
    "    print('优化后的内存占用: {:.2f} MB'.format(end_mem))\n",
    "    print('减少的百分比 {:.1f}%'.format(100 * (start_mem - end_mem) / start_mem))\n",
    "    \n",
    "    return df"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "```\n",
    "函数 reduce_mem_usage(DataFrame):\n",
    "    1. 计算初始内存占用 start_mem\n",
    "    2. 遍历 DataFrame 的每一列:\n",
    "        a. 获取列的数据类型 col_type\n",
    "        b. 如果列是数值型数据:\n",
    "            i. 计算列的最小值 c_min 和最大值 c_max\n",
    "            ii. 如果是整型数据:\n",
    "                - 根据数据范围，将类型转换为 int8/int16/int32/int64 中最小的可用类型\n",
    "            iii. 如果是浮点型数据:\n",
    "                - 根据数据范围，将类型转换为 float16/float32/float64 中最小的可用类型\n",
    "        c. 如果列是字符串型数据:\n",
    "            - 将其类型转换为 category\n",
    "    3. 计算优化后的内存占用 end_mem\n",
    "    4. 打印优化前后的内存占用和减少百分比\n",
    "    5. 返回优化后的 DataFrame\n",
    "```"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 对训练集的数据进行处理和精度量化"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {
    "execution": {
     "iopub.execute_input": "2025-01-01T03:12:46.236359Z",
     "iopub.status.busy": "2025-01-01T03:12:46.236109Z",
     "iopub.status.idle": "2025-01-01T03:12:54.721521Z",
     "shell.execute_reply": "2025-01-01T03:12:54.720578Z",
     "shell.execute_reply.started": "2025-01-01T03:12:46.236333Z"
    },
    "trusted": true
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "优化前的数据集内存大小 157.93 MB\n",
      "优化后的内存占用: 39.67 MB\n",
      "减少的百分比 74.9%\n"
     ]
    }
   ],
   "source": [
    "# 训练集特征处理与精度量化\n",
    "train_list = [] # 初始化一个空列表\n",
    "for items in train.values:\n",
    "    train_list.append([items[0]] + [float(i) for i in items[1].split(',')] + [items[2]])\n",
    "train = pd.DataFrame(np.array(train_list))\n",
    "train.columns = ['id'] + ['s_' + str(i) for i in range(len(train_list[0])-2)] + ['label']  # 特征分离\n",
    "train = reduce_mem_usage(train)  #调用 reduce_mem_usage 函数进行精度量化"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "```\n",
    "函数：训练集特征处理与精度量化(train)\n",
    "1. 初始化空列表 train_list\n",
    "\n",
    "2. 遍历 train 的每一行数据 items：\n",
    "   a. 将第一列（id）保留\n",
    "   b. 将第二列（heartbeat_signals）的字符串用逗号分隔，并将每个值转换为浮点数\n",
    "   c. 将第三列（label）保留\n",
    "   d. 将处理后的 id + heartbeat_signals + label 组合成一个新列表，追加到 train_list 中\n",
    "\n",
    "3. 将 train_list 转换为 NumPy 数组，再转换为 Pandas DataFrame 格式\n",
    "\n",
    "4. 设置 DataFrame 的列名：\n",
    "   a. 第一列命名为 'id'\n",
    "   b. 中间的列命名为 's_0', 's_1', ..., 's_204'，表示心跳信号序列的特征列\n",
    "   c. 最后一列命名为 'label'\n",
    "\n",
    "5. 调用 reduce_mem_usage 函数，对处理后的 DataFrame 进行精度量化，优化内存使用\n",
    "\n",
    "6. 返回处理完成的训练集 DataFrame\n",
    "```\n",
    "\n",
    "------\n",
    "\n",
    "**数据处理前后对比**\n",
    "\n",
    "原始训练集 `train.csv` 的部分内容如下：\n",
    "| id     | heartbeat_signals             | label |\n",
    "|--------|--------------------------------|-------|\n",
    "| 10001  | 0.1,0.2,0.3,...,0.4           | 0     |\n",
    "| 10002  | 0.5,0.6,0.7,...,0.8           | 1     |\n",
    "\n",
    "处理后生成的 DataFrame `train`：\n",
    "| id     | s_0  | s_1  | s_2  | ... | s_204 | label |\n",
    "|--------|------|------|------|-----|-------|-------|\n",
    "| 10001  | 0.1  | 0.2  | 0.3  | ... | 0.4   | 0     |\n",
    "| 10002  | 0.5  | 0.6  | 0.7  | ... | 0.8   | 1     |\n",
    "\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 对测试集的数据进行特征处理和内存优化"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "metadata": {
    "execution": {
     "iopub.execute_input": "2025-01-01T03:12:54.722616Z",
     "iopub.status.busy": "2025-01-01T03:12:54.722365Z",
     "iopub.status.idle": "2025-01-01T03:12:56.407888Z",
     "shell.execute_reply": "2025-01-01T03:12:56.406882Z",
     "shell.execute_reply.started": "2025-01-01T03:12:54.722594Z"
    },
    "trusted": true
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "优化前的数据集内存大小 31.43 MB\n",
      "优化后的内存占用: 7.90 MB\n",
      "减少的百分比 74.9%\n"
     ]
    }
   ],
   "source": [
    "# 测试集特征处理与精度量化\n",
    "test_list=[]\n",
    "for items in test.values:\n",
    "    test_list.append([items[0]] + [float(i) for i in items[1].split(',')])\n",
    "test = pd.DataFrame(np.array(test_list))\n",
    "test.columns = ['id'] + ['s_'+str(i) for i in range(len(test_list[0])-1)]  # 特征分离\n",
    "test = reduce_mem_usage(test)  # 精度量化"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "```\n",
    "1. 初始化空列表 test_list\n",
    "\n",
    "2. 遍历测试集 test 的每一行 items:\n",
    "   a. 提取第一列（id）\n",
    "   b. 将第二列（heartbeat_signals）的字符串用逗号分隔，并将每个值转换为浮点数\n",
    "   c. 将 id + heartbeat_signals 合并为一个新列表，添加到 test_list\n",
    "\n",
    "3. 将 test_list 转换为 NumPy 数组，再转换为 Pandas DataFrame\n",
    "\n",
    "4. 设置 DataFrame 的列名：\n",
    "   a. 第一列命名为 'id'\n",
    "   b. 中间的列命名为 's_0', 's_1', ..., 's_N'，表示心跳信号序列的特征列（N 为信号序列长度）\n",
    "   \n",
    "5. 调用 reduce_mem_usage 函数：\n",
    "   a. 优化列数据类型，减少内存占用\n",
    "\n",
    "6. 返回处理后的测试集 DataFrame\n",
    "```\n",
    "\n",
    "**数据处理前后对比**\n",
    "\n",
    "假设原始测试集 `test.csv` 的部分内容如下：\n",
    "| id     | heartbeat_signals             |\n",
    "|--------|--------------------------------|\n",
    "| 20001  | 0.1,0.2,0.3,...,0.4           |\n",
    "| 20002  | 0.5,0.6,0.7,...,0.8           |\n",
    "\n",
    "处理后生成的 DataFrame `test`：\n",
    "| id     | s_0  | s_1  | s_2  | ... | s_204 |\n",
    "|--------|------|------|------|-----|-------|\n",
    "| 20001  | 0.1  | 0.2  | 0.3  | ... | 0.4   |\n",
    "| 20002  | 0.5  | 0.6  | 0.7  | ... | 0.8   |\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 处理训练集和测试集"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "metadata": {
    "execution": {
     "iopub.execute_input": "2025-01-01T03:12:56.409123Z",
     "iopub.status.busy": "2025-01-01T03:12:56.408830Z",
     "iopub.status.idle": "2025-01-01T03:12:56.500460Z",
     "shell.execute_reply": "2025-01-01T03:12:56.499555Z",
     "shell.execute_reply.started": "2025-01-01T03:12:56.409098Z"
    },
    "trusted": true
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "(100000, 205) (100000,)\n",
      "(20000, 205)\n",
      "(20000, 205, 1) float16\n"
     ]
    }
   ],
   "source": [
    "# 查看训练集, 分离标签与样本, 去除 id\n",
    "y_train = train['label']\n",
    "x_train = train.drop(['id', 'label'], axis=1)\n",
    "print(x_train.shape, y_train.shape)\n",
    "\n",
    "# 查看测试集, 去除 id\n",
    "X_test = test.drop(['id'], axis=1)\n",
    "print(X_test.shape)\n",
    "\n",
    "# 将测试集转换为适应 CNN 输入的 shape\n",
    "X_test = np.array(X_test).reshape(X_test.shape[0], X_test.shape[1], 1)\n",
    "print(X_test.shape, X_test.dtype)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "* 卷积神经网络（CNN）处理数据时需要三维输入格式，形状为 (样本数量, 特征数量, 通道数)。\n",
    "* 深度学习模型（如 CNN）只能接受 NumPy 数组或类似张量的输入格式\n",
    "* Shape 是数组或矩阵的“形状”，描述数据的维度结构，即数据在每个维度上的大小。\n",
    "    * 一维数据：形状如 (n,)，表示有 n 个元素。\n",
    "    * 二维数据：形状如 (m, n)，表示有 m 行，n 列。\n",
    "    * 三维数据：形状如 (batch_size, height, width)，常用于图片或序列。\n",
    "    * 四维数据：形状如 (batch_size, height, width, channels)，用于彩色图片的输入。\n",
    "* 灰度图像\n",
    "    * 灰度图像是没有颜色信息的图像，每个像素点只有一个值，表示黑白的强度（灰度值）。\n",
    "        * 灰度值的范围通常是 0（黑色）到 255（白色）。\n",
    "        * 示例：如果是彩色图片（如 RGB 图像），每个像素会有 3 个值（红、绿、蓝）。而灰度图像只有 1 个值。\n",
    "    * 类似性：\n",
    "        * 灰度图像是一种 2D 单通道数据。\n",
    "        * 心跳信号是一种 1D 单通道数据。\n",
    "        * 两者都只有一个维度的特征值，因此通道数为 1。\n",
    "\n",
    "-----\n",
    "\n",
    "```\n",
    "1. 处理训练集：\n",
    "   a. 从 train 中提取目标标签列 'label'，存入 y_train\n",
    "   b. 从 train 中删除 'id' 和 'label' 列，保留特征列，存入 x_train\n",
    "   c. 打印训练集特征矩阵和标签的形状 (x_train.shape, y_train.shape)\n",
    "\n",
    "2. 处理测试集：\n",
    "   a. 从 test 中删除 'id' 列，保留特征列，存入 X_test\n",
    "   b. 打印测试集特征矩阵的形状 (X_test.shape)\n",
    "\n",
    "3. 调整测试集形状以适配 CNN 输入：\n",
    "   a. 将 X_test 转换为 NumPy 数组\n",
    "   b. 调整 X_test 的形状为 (样本数量, 特征数量, 通道数)，通道数设为 1\n",
    "   c. 打印调整后的测试集形状和数据类型 (X_test.shape, X_test.dtype)\n",
    "\n",
    "返回：x_train, y_train, X_test\n",
    "```"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 数据探索性分析"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 基本分析"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 查看数据集的前 5 行"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "metadata": {
    "execution": {
     "iopub.execute_input": "2025-01-01T03:12:56.501781Z",
     "iopub.status.busy": "2025-01-01T03:12:56.501458Z",
     "iopub.status.idle": "2025-01-01T03:12:56.532606Z",
     "shell.execute_reply": "2025-01-01T03:12:56.531962Z",
     "shell.execute_reply.started": "2025-01-01T03:12:56.501752Z"
    },
    "trusted": true
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>id</th>\n",
       "      <th>s_0</th>\n",
       "      <th>s_1</th>\n",
       "      <th>s_2</th>\n",
       "      <th>s_3</th>\n",
       "      <th>s_4</th>\n",
       "      <th>s_5</th>\n",
       "      <th>s_6</th>\n",
       "      <th>s_7</th>\n",
       "      <th>s_8</th>\n",
       "      <th>...</th>\n",
       "      <th>s_196</th>\n",
       "      <th>s_197</th>\n",
       "      <th>s_198</th>\n",
       "      <th>s_199</th>\n",
       "      <th>s_200</th>\n",
       "      <th>s_201</th>\n",
       "      <th>s_202</th>\n",
       "      <th>s_203</th>\n",
       "      <th>s_204</th>\n",
       "      <th>label</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>0.0</td>\n",
       "      <td>0.991211</td>\n",
       "      <td>0.943359</td>\n",
       "      <td>0.764648</td>\n",
       "      <td>0.618652</td>\n",
       "      <td>0.379639</td>\n",
       "      <td>0.190796</td>\n",
       "      <td>0.040222</td>\n",
       "      <td>0.026001</td>\n",
       "      <td>0.031708</td>\n",
       "      <td>...</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>1.0</td>\n",
       "      <td>0.971680</td>\n",
       "      <td>0.929199</td>\n",
       "      <td>0.572754</td>\n",
       "      <td>0.178467</td>\n",
       "      <td>0.122986</td>\n",
       "      <td>0.132324</td>\n",
       "      <td>0.094421</td>\n",
       "      <td>0.089600</td>\n",
       "      <td>0.030487</td>\n",
       "      <td>...</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>2.0</td>\n",
       "      <td>1.000000</td>\n",
       "      <td>0.958984</td>\n",
       "      <td>0.701172</td>\n",
       "      <td>0.231812</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.080688</td>\n",
       "      <td>0.128418</td>\n",
       "      <td>0.187500</td>\n",
       "      <td>0.280762</td>\n",
       "      <td>...</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>2.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>3.0</td>\n",
       "      <td>0.975586</td>\n",
       "      <td>0.934082</td>\n",
       "      <td>0.659668</td>\n",
       "      <td>0.249878</td>\n",
       "      <td>0.237061</td>\n",
       "      <td>0.281494</td>\n",
       "      <td>0.249878</td>\n",
       "      <td>0.249878</td>\n",
       "      <td>0.241455</td>\n",
       "      <td>...</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>4.0</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.055817</td>\n",
       "      <td>0.261230</td>\n",
       "      <td>0.359863</td>\n",
       "      <td>0.433105</td>\n",
       "      <td>0.453613</td>\n",
       "      <td>0.499023</td>\n",
       "      <td>0.542969</td>\n",
       "      <td>0.616699</td>\n",
       "      <td>...</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>2.0</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "<p>5 rows × 207 columns</p>\n",
       "</div>"
      ],
      "text/plain": [
       "    id       s_0       s_1       s_2       s_3       s_4       s_5       s_6  \\\n",
       "0  0.0  0.991211  0.943359  0.764648  0.618652  0.379639  0.190796  0.040222   \n",
       "1  1.0  0.971680  0.929199  0.572754  0.178467  0.122986  0.132324  0.094421   \n",
       "2  2.0  1.000000  0.958984  0.701172  0.231812  0.000000  0.080688  0.128418   \n",
       "3  3.0  0.975586  0.934082  0.659668  0.249878  0.237061  0.281494  0.249878   \n",
       "4  4.0  0.000000  0.055817  0.261230  0.359863  0.433105  0.453613  0.499023   \n",
       "\n",
       "        s_7       s_8  ...  s_196  s_197  s_198  s_199  s_200  s_201  s_202  \\\n",
       "0  0.026001  0.031708  ...    0.0    0.0    0.0    0.0    0.0    0.0    0.0   \n",
       "1  0.089600  0.030487  ...    0.0    0.0    0.0    0.0    0.0    0.0    0.0   \n",
       "2  0.187500  0.280762  ...    0.0    0.0    0.0    0.0    0.0    0.0    0.0   \n",
       "3  0.249878  0.241455  ...    0.0    0.0    0.0    0.0    0.0    0.0    0.0   \n",
       "4  0.542969  0.616699  ...    0.0    0.0    0.0    0.0    0.0    0.0    0.0   \n",
       "\n",
       "   s_203  s_204  label  \n",
       "0    0.0    0.0    0.0  \n",
       "1    0.0    0.0    0.0  \n",
       "2    0.0    0.0    2.0  \n",
       "3    0.0    0.0    0.0  \n",
       "4    0.0    0.0    2.0  \n",
       "\n",
       "[5 rows x 207 columns]"
      ]
     },
     "execution_count": 14,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "train.head()  # 查看前 5 条信息"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "metadata": {
    "execution": {
     "iopub.execute_input": "2025-01-01T03:12:56.533426Z",
     "iopub.status.busy": "2025-01-01T03:12:56.533229Z",
     "iopub.status.idle": "2025-01-01T03:12:56.555504Z",
     "shell.execute_reply": "2025-01-01T03:12:56.554870Z",
     "shell.execute_reply.started": "2025-01-01T03:12:56.533409Z"
    },
    "trusted": true
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>id</th>\n",
       "      <th>s_0</th>\n",
       "      <th>s_1</th>\n",
       "      <th>s_2</th>\n",
       "      <th>s_3</th>\n",
       "      <th>s_4</th>\n",
       "      <th>s_5</th>\n",
       "      <th>s_6</th>\n",
       "      <th>s_7</th>\n",
       "      <th>s_8</th>\n",
       "      <th>...</th>\n",
       "      <th>s_195</th>\n",
       "      <th>s_196</th>\n",
       "      <th>s_197</th>\n",
       "      <th>s_198</th>\n",
       "      <th>s_199</th>\n",
       "      <th>s_200</th>\n",
       "      <th>s_201</th>\n",
       "      <th>s_202</th>\n",
       "      <th>s_203</th>\n",
       "      <th>s_204</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>100000.0</td>\n",
       "      <td>0.991699</td>\n",
       "      <td>1.000000</td>\n",
       "      <td>0.631836</td>\n",
       "      <td>0.136230</td>\n",
       "      <td>0.041412</td>\n",
       "      <td>0.102722</td>\n",
       "      <td>0.120850</td>\n",
       "      <td>0.123413</td>\n",
       "      <td>0.107910</td>\n",
       "      <td>...</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.00000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>100001.0</td>\n",
       "      <td>0.607422</td>\n",
       "      <td>0.541504</td>\n",
       "      <td>0.340576</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.090698</td>\n",
       "      <td>0.164917</td>\n",
       "      <td>0.195068</td>\n",
       "      <td>0.168823</td>\n",
       "      <td>0.198853</td>\n",
       "      <td>...</td>\n",
       "      <td>0.389893</td>\n",
       "      <td>0.386963</td>\n",
       "      <td>0.367188</td>\n",
       "      <td>0.364014</td>\n",
       "      <td>0.360596</td>\n",
       "      <td>0.357178</td>\n",
       "      <td>0.350586</td>\n",
       "      <td>0.350586</td>\n",
       "      <td>0.350586</td>\n",
       "      <td>0.36377</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>100002.0</td>\n",
       "      <td>0.975098</td>\n",
       "      <td>0.670898</td>\n",
       "      <td>0.686523</td>\n",
       "      <td>0.708496</td>\n",
       "      <td>0.718750</td>\n",
       "      <td>0.716797</td>\n",
       "      <td>0.720703</td>\n",
       "      <td>0.701660</td>\n",
       "      <td>0.596680</td>\n",
       "      <td>...</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.00000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>100003.0</td>\n",
       "      <td>0.995605</td>\n",
       "      <td>0.916992</td>\n",
       "      <td>0.520996</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.221802</td>\n",
       "      <td>0.404053</td>\n",
       "      <td>0.490479</td>\n",
       "      <td>0.527344</td>\n",
       "      <td>0.518066</td>\n",
       "      <td>...</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.00000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>100004.0</td>\n",
       "      <td>1.000000</td>\n",
       "      <td>0.888184</td>\n",
       "      <td>0.745605</td>\n",
       "      <td>0.531738</td>\n",
       "      <td>0.380371</td>\n",
       "      <td>0.224609</td>\n",
       "      <td>0.091125</td>\n",
       "      <td>0.057648</td>\n",
       "      <td>0.003914</td>\n",
       "      <td>...</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.00000</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "<p>5 rows × 206 columns</p>\n",
       "</div>"
      ],
      "text/plain": [
       "         id       s_0       s_1       s_2       s_3       s_4       s_5  \\\n",
       "0  100000.0  0.991699  1.000000  0.631836  0.136230  0.041412  0.102722   \n",
       "1  100001.0  0.607422  0.541504  0.340576  0.000000  0.090698  0.164917   \n",
       "2  100002.0  0.975098  0.670898  0.686523  0.708496  0.718750  0.716797   \n",
       "3  100003.0  0.995605  0.916992  0.520996  0.000000  0.221802  0.404053   \n",
       "4  100004.0  1.000000  0.888184  0.745605  0.531738  0.380371  0.224609   \n",
       "\n",
       "        s_6       s_7       s_8  ...     s_195     s_196     s_197     s_198  \\\n",
       "0  0.120850  0.123413  0.107910  ...  0.000000  0.000000  0.000000  0.000000   \n",
       "1  0.195068  0.168823  0.198853  ...  0.389893  0.386963  0.367188  0.364014   \n",
       "2  0.720703  0.701660  0.596680  ...  0.000000  0.000000  0.000000  0.000000   \n",
       "3  0.490479  0.527344  0.518066  ...  0.000000  0.000000  0.000000  0.000000   \n",
       "4  0.091125  0.057648  0.003914  ...  0.000000  0.000000  0.000000  0.000000   \n",
       "\n",
       "      s_199     s_200     s_201     s_202     s_203    s_204  \n",
       "0  0.000000  0.000000  0.000000  0.000000  0.000000  0.00000  \n",
       "1  0.360596  0.357178  0.350586  0.350586  0.350586  0.36377  \n",
       "2  0.000000  0.000000  0.000000  0.000000  0.000000  0.00000  \n",
       "3  0.000000  0.000000  0.000000  0.000000  0.000000  0.00000  \n",
       "4  0.000000  0.000000  0.000000  0.000000  0.000000  0.00000  \n",
       "\n",
       "[5 rows x 206 columns]"
      ]
     },
     "execution_count": 15,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "test.head()  # 查看前 5 条信息"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 数据统计摘要"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "metadata": {
    "execution": {
     "iopub.execute_input": "2025-01-01T03:12:56.556426Z",
     "iopub.status.busy": "2025-01-01T03:12:56.556237Z",
     "iopub.status.idle": "2025-01-01T03:12:58.854706Z",
     "shell.execute_reply": "2025-01-01T03:12:58.853782Z",
     "shell.execute_reply.started": "2025-01-01T03:12:56.556410Z"
    },
    "trusted": true
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>id</th>\n",
       "      <th>s_0</th>\n",
       "      <th>s_1</th>\n",
       "      <th>s_2</th>\n",
       "      <th>s_3</th>\n",
       "      <th>s_4</th>\n",
       "      <th>s_5</th>\n",
       "      <th>s_6</th>\n",
       "      <th>s_7</th>\n",
       "      <th>s_8</th>\n",
       "      <th>...</th>\n",
       "      <th>s_196</th>\n",
       "      <th>s_197</th>\n",
       "      <th>s_198</th>\n",
       "      <th>s_199</th>\n",
       "      <th>s_200</th>\n",
       "      <th>s_201</th>\n",
       "      <th>s_202</th>\n",
       "      <th>s_203</th>\n",
       "      <th>s_204</th>\n",
       "      <th>label</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>count</th>\n",
       "      <td>100000.000000</td>\n",
       "      <td>100000.000000</td>\n",
       "      <td>100000.000000</td>\n",
       "      <td>100000.000000</td>\n",
       "      <td>100000.000000</td>\n",
       "      <td>100000.000000</td>\n",
       "      <td>100000.000000</td>\n",
       "      <td>100000.000000</td>\n",
       "      <td>100000.000000</td>\n",
       "      <td>100000.000000</td>\n",
       "      <td>...</td>\n",
       "      <td>100000.0</td>\n",
       "      <td>100000.0</td>\n",
       "      <td>100000.000000</td>\n",
       "      <td>100000.0</td>\n",
       "      <td>100000.0</td>\n",
       "      <td>100000.0</td>\n",
       "      <td>100000.0</td>\n",
       "      <td>100000.0</td>\n",
       "      <td>100000.0</td>\n",
       "      <td>100000.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>mean</th>\n",
       "      <td>49999.500000</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>...</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>std</th>\n",
       "      <td>28867.658203</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>...</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>min</th>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>...</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>25%</th>\n",
       "      <td>24999.750000</td>\n",
       "      <td>0.913086</td>\n",
       "      <td>0.694824</td>\n",
       "      <td>0.346436</td>\n",
       "      <td>0.096191</td>\n",
       "      <td>0.129883</td>\n",
       "      <td>0.134521</td>\n",
       "      <td>0.112183</td>\n",
       "      <td>0.101013</td>\n",
       "      <td>0.100586</td>\n",
       "      <td>...</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>50%</th>\n",
       "      <td>49999.500000</td>\n",
       "      <td>0.984375</td>\n",
       "      <td>0.859375</td>\n",
       "      <td>0.548828</td>\n",
       "      <td>0.282471</td>\n",
       "      <td>0.238037</td>\n",
       "      <td>0.245850</td>\n",
       "      <td>0.226562</td>\n",
       "      <td>0.233765</td>\n",
       "      <td>0.235352</td>\n",
       "      <td>...</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>75%</th>\n",
       "      <td>74999.250000</td>\n",
       "      <td>1.000000</td>\n",
       "      <td>0.933105</td>\n",
       "      <td>0.685547</td>\n",
       "      <td>0.519531</td>\n",
       "      <td>0.431396</td>\n",
       "      <td>0.443115</td>\n",
       "      <td>0.450439</td>\n",
       "      <td>0.432373</td>\n",
       "      <td>0.396484</td>\n",
       "      <td>...</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>2.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>max</th>\n",
       "      <td>99999.000000</td>\n",
       "      <td>1.000000</td>\n",
       "      <td>1.000000</td>\n",
       "      <td>1.000000</td>\n",
       "      <td>1.000000</td>\n",
       "      <td>1.000000</td>\n",
       "      <td>1.000000</td>\n",
       "      <td>1.000000</td>\n",
       "      <td>1.000000</td>\n",
       "      <td>1.000000</td>\n",
       "      <td>...</td>\n",
       "      <td>1.0</td>\n",
       "      <td>1.0</td>\n",
       "      <td>0.983887</td>\n",
       "      <td>1.0</td>\n",
       "      <td>1.0</td>\n",
       "      <td>1.0</td>\n",
       "      <td>1.0</td>\n",
       "      <td>1.0</td>\n",
       "      <td>1.0</td>\n",
       "      <td>3.0</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "<p>8 rows × 207 columns</p>\n",
       "</div>"
      ],
      "text/plain": [
       "                  id            s_0            s_1            s_2  \\\n",
       "count  100000.000000  100000.000000  100000.000000  100000.000000   \n",
       "mean    49999.500000            NaN            NaN       0.000000   \n",
       "std     28867.658203       0.000000       0.000000       0.000000   \n",
       "min         0.000000       0.000000       0.000000       0.000000   \n",
       "25%     24999.750000       0.913086       0.694824       0.346436   \n",
       "50%     49999.500000       0.984375       0.859375       0.548828   \n",
       "75%     74999.250000       1.000000       0.933105       0.685547   \n",
       "max     99999.000000       1.000000       1.000000       1.000000   \n",
       "\n",
       "                 s_3            s_4            s_5            s_6  \\\n",
       "count  100000.000000  100000.000000  100000.000000  100000.000000   \n",
       "mean        0.000000       0.000000       0.000000       0.000000   \n",
       "std         0.000000       0.000000       0.000000       0.000000   \n",
       "min         0.000000       0.000000       0.000000       0.000000   \n",
       "25%         0.096191       0.129883       0.134521       0.112183   \n",
       "50%         0.282471       0.238037       0.245850       0.226562   \n",
       "75%         0.519531       0.431396       0.443115       0.450439   \n",
       "max         1.000000       1.000000       1.000000       1.000000   \n",
       "\n",
       "                 s_7            s_8  ...     s_196     s_197          s_198  \\\n",
       "count  100000.000000  100000.000000  ...  100000.0  100000.0  100000.000000   \n",
       "mean        0.000000       0.000000  ...       0.0       0.0       0.000000   \n",
       "std         0.000000       0.000000  ...       0.0       0.0       0.000000   \n",
       "min         0.000000       0.000000  ...       0.0       0.0       0.000000   \n",
       "25%         0.101013       0.100586  ...       0.0       0.0       0.000000   \n",
       "50%         0.233765       0.235352  ...       0.0       0.0       0.000000   \n",
       "75%         0.432373       0.396484  ...       0.0       0.0       0.000000   \n",
       "max         1.000000       1.000000  ...       1.0       1.0       0.983887   \n",
       "\n",
       "          s_199     s_200     s_201     s_202     s_203     s_204     label  \n",
       "count  100000.0  100000.0  100000.0  100000.0  100000.0  100000.0  100000.0  \n",
       "mean        0.0       0.0       0.0       0.0       0.0       0.0       NaN  \n",
       "std         0.0       0.0       0.0       0.0       0.0       0.0       0.0  \n",
       "min         0.0       0.0       0.0       0.0       0.0       0.0       0.0  \n",
       "25%         0.0       0.0       0.0       0.0       0.0       0.0       0.0  \n",
       "50%         0.0       0.0       0.0       0.0       0.0       0.0       0.0  \n",
       "75%         0.0       0.0       0.0       0.0       0.0       0.0       2.0  \n",
       "max         1.0       1.0       1.0       1.0       1.0       1.0       3.0  \n",
       "\n",
       "[8 rows x 207 columns]"
      ]
     },
     "execution_count": 16,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "import warnings\n",
    "warnings.filterwarnings('ignore', category=RuntimeWarning)\n",
    "\n",
    "train.describe()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "使用 Python 的 warnings 模块临时忽略警告：\n",
    "* 数据中存在异常值（过大或过小）。\n",
    "* 数据中存在 NaN 或 Infinity。\n",
    "* 数据类型的精度不足，导致溢出。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 17,
   "metadata": {
    "execution": {
     "iopub.execute_input": "2025-01-01T03:12:58.856085Z",
     "iopub.status.busy": "2025-01-01T03:12:58.855758Z",
     "iopub.status.idle": "2025-01-01T03:12:59.529523Z",
     "shell.execute_reply": "2025-01-01T03:12:59.528665Z",
     "shell.execute_reply.started": "2025-01-01T03:12:58.856054Z"
    },
    "trusted": true
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>id</th>\n",
       "      <th>s_0</th>\n",
       "      <th>s_1</th>\n",
       "      <th>s_2</th>\n",
       "      <th>s_3</th>\n",
       "      <th>s_4</th>\n",
       "      <th>s_5</th>\n",
       "      <th>s_6</th>\n",
       "      <th>s_7</th>\n",
       "      <th>s_8</th>\n",
       "      <th>...</th>\n",
       "      <th>s_195</th>\n",
       "      <th>s_196</th>\n",
       "      <th>s_197</th>\n",
       "      <th>s_198</th>\n",
       "      <th>s_199</th>\n",
       "      <th>s_200</th>\n",
       "      <th>s_201</th>\n",
       "      <th>s_202</th>\n",
       "      <th>s_203</th>\n",
       "      <th>s_204</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>count</th>\n",
       "      <td>20000.000000</td>\n",
       "      <td>20000.000000</td>\n",
       "      <td>20000.000000</td>\n",
       "      <td>20000.000000</td>\n",
       "      <td>20000.000000</td>\n",
       "      <td>20000.000000</td>\n",
       "      <td>20000.000000</td>\n",
       "      <td>20000.000000</td>\n",
       "      <td>20000.000000</td>\n",
       "      <td>20000.000000</td>\n",
       "      <td>...</td>\n",
       "      <td>20000.000000</td>\n",
       "      <td>20000.000000</td>\n",
       "      <td>20000.000000</td>\n",
       "      <td>20000.000000</td>\n",
       "      <td>20000.000000</td>\n",
       "      <td>20000.000000</td>\n",
       "      <td>20000.000000</td>\n",
       "      <td>20000.000000</td>\n",
       "      <td>20000.000000</td>\n",
       "      <td>20000.000000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>mean</th>\n",
       "      <td>109999.500000</td>\n",
       "      <td>0.872559</td>\n",
       "      <td>0.772461</td>\n",
       "      <td>0.514648</td>\n",
       "      <td>0.323242</td>\n",
       "      <td>0.301270</td>\n",
       "      <td>0.303955</td>\n",
       "      <td>0.292725</td>\n",
       "      <td>0.281738</td>\n",
       "      <td>0.270996</td>\n",
       "      <td>...</td>\n",
       "      <td>0.008499</td>\n",
       "      <td>0.007965</td>\n",
       "      <td>0.007450</td>\n",
       "      <td>0.007214</td>\n",
       "      <td>0.006939</td>\n",
       "      <td>0.006599</td>\n",
       "      <td>0.006386</td>\n",
       "      <td>0.005981</td>\n",
       "      <td>0.005295</td>\n",
       "      <td>0.005150</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>std</th>\n",
       "      <td>5773.646973</td>\n",
       "      <td>0.263916</td>\n",
       "      <td>0.237549</td>\n",
       "      <td>0.241699</td>\n",
       "      <td>0.256592</td>\n",
       "      <td>0.226685</td>\n",
       "      <td>0.215088</td>\n",
       "      <td>0.218262</td>\n",
       "      <td>0.212036</td>\n",
       "      <td>0.200073</td>\n",
       "      <td>...</td>\n",
       "      <td>0.061371</td>\n",
       "      <td>0.059784</td>\n",
       "      <td>0.058044</td>\n",
       "      <td>0.056641</td>\n",
       "      <td>0.056061</td>\n",
       "      <td>0.054382</td>\n",
       "      <td>0.053833</td>\n",
       "      <td>0.051910</td>\n",
       "      <td>0.048462</td>\n",
       "      <td>0.047272</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>min</th>\n",
       "      <td>100000.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>...</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>25%</th>\n",
       "      <td>104999.750000</td>\n",
       "      <td>0.910645</td>\n",
       "      <td>0.690918</td>\n",
       "      <td>0.341003</td>\n",
       "      <td>0.097336</td>\n",
       "      <td>0.129272</td>\n",
       "      <td>0.134155</td>\n",
       "      <td>0.111816</td>\n",
       "      <td>0.101379</td>\n",
       "      <td>0.100403</td>\n",
       "      <td>...</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>50%</th>\n",
       "      <td>109999.500000</td>\n",
       "      <td>0.983887</td>\n",
       "      <td>0.857422</td>\n",
       "      <td>0.545410</td>\n",
       "      <td>0.279785</td>\n",
       "      <td>0.237305</td>\n",
       "      <td>0.247437</td>\n",
       "      <td>0.227722</td>\n",
       "      <td>0.233765</td>\n",
       "      <td>0.236694</td>\n",
       "      <td>...</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>75%</th>\n",
       "      <td>114999.250000</td>\n",
       "      <td>1.000000</td>\n",
       "      <td>0.932617</td>\n",
       "      <td>0.683105</td>\n",
       "      <td>0.515137</td>\n",
       "      <td>0.429199</td>\n",
       "      <td>0.443848</td>\n",
       "      <td>0.451904</td>\n",
       "      <td>0.436523</td>\n",
       "      <td>0.401123</td>\n",
       "      <td>...</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>max</th>\n",
       "      <td>119999.000000</td>\n",
       "      <td>1.000000</td>\n",
       "      <td>1.000000</td>\n",
       "      <td>1.000000</td>\n",
       "      <td>0.998535</td>\n",
       "      <td>1.000000</td>\n",
       "      <td>1.000000</td>\n",
       "      <td>1.000000</td>\n",
       "      <td>1.000000</td>\n",
       "      <td>1.000000</td>\n",
       "      <td>...</td>\n",
       "      <td>1.000000</td>\n",
       "      <td>1.000000</td>\n",
       "      <td>1.000000</td>\n",
       "      <td>0.978516</td>\n",
       "      <td>1.000000</td>\n",
       "      <td>1.000000</td>\n",
       "      <td>1.000000</td>\n",
       "      <td>0.990234</td>\n",
       "      <td>0.999023</td>\n",
       "      <td>0.843262</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "<p>8 rows × 206 columns</p>\n",
       "</div>"
      ],
      "text/plain": [
       "                  id           s_0           s_1           s_2           s_3  \\\n",
       "count   20000.000000  20000.000000  20000.000000  20000.000000  20000.000000   \n",
       "mean   109999.500000      0.872559      0.772461      0.514648      0.323242   \n",
       "std      5773.646973      0.263916      0.237549      0.241699      0.256592   \n",
       "min    100000.000000      0.000000      0.000000      0.000000      0.000000   \n",
       "25%    104999.750000      0.910645      0.690918      0.341003      0.097336   \n",
       "50%    109999.500000      0.983887      0.857422      0.545410      0.279785   \n",
       "75%    114999.250000      1.000000      0.932617      0.683105      0.515137   \n",
       "max    119999.000000      1.000000      1.000000      1.000000      0.998535   \n",
       "\n",
       "                s_4           s_5           s_6           s_7           s_8  \\\n",
       "count  20000.000000  20000.000000  20000.000000  20000.000000  20000.000000   \n",
       "mean       0.301270      0.303955      0.292725      0.281738      0.270996   \n",
       "std        0.226685      0.215088      0.218262      0.212036      0.200073   \n",
       "min        0.000000      0.000000      0.000000      0.000000      0.000000   \n",
       "25%        0.129272      0.134155      0.111816      0.101379      0.100403   \n",
       "50%        0.237305      0.247437      0.227722      0.233765      0.236694   \n",
       "75%        0.429199      0.443848      0.451904      0.436523      0.401123   \n",
       "max        1.000000      1.000000      1.000000      1.000000      1.000000   \n",
       "\n",
       "       ...         s_195         s_196         s_197         s_198  \\\n",
       "count  ...  20000.000000  20000.000000  20000.000000  20000.000000   \n",
       "mean   ...      0.008499      0.007965      0.007450      0.007214   \n",
       "std    ...      0.061371      0.059784      0.058044      0.056641   \n",
       "min    ...      0.000000      0.000000      0.000000      0.000000   \n",
       "25%    ...      0.000000      0.000000      0.000000      0.000000   \n",
       "50%    ...      0.000000      0.000000      0.000000      0.000000   \n",
       "75%    ...      0.000000      0.000000      0.000000      0.000000   \n",
       "max    ...      1.000000      1.000000      1.000000      0.978516   \n",
       "\n",
       "              s_199         s_200         s_201         s_202         s_203  \\\n",
       "count  20000.000000  20000.000000  20000.000000  20000.000000  20000.000000   \n",
       "mean       0.006939      0.006599      0.006386      0.005981      0.005295   \n",
       "std        0.056061      0.054382      0.053833      0.051910      0.048462   \n",
       "min        0.000000      0.000000      0.000000      0.000000      0.000000   \n",
       "25%        0.000000      0.000000      0.000000      0.000000      0.000000   \n",
       "50%        0.000000      0.000000      0.000000      0.000000      0.000000   \n",
       "75%        0.000000      0.000000      0.000000      0.000000      0.000000   \n",
       "max        1.000000      1.000000      1.000000      0.990234      0.999023   \n",
       "\n",
       "              s_204  \n",
       "count  20000.000000  \n",
       "mean       0.005150  \n",
       "std        0.047272  \n",
       "min        0.000000  \n",
       "25%        0.000000  \n",
       "50%        0.000000  \n",
       "75%        0.000000  \n",
       "max        0.843262  \n",
       "\n",
       "[8 rows x 206 columns]"
      ]
     },
     "execution_count": 17,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "test.describe()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 查看数据集的整体信息"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 18,
   "metadata": {
    "execution": {
     "iopub.execute_input": "2025-01-01T03:12:59.530680Z",
     "iopub.status.busy": "2025-01-01T03:12:59.530368Z",
     "iopub.status.idle": "2025-01-01T03:12:59.545327Z",
     "shell.execute_reply": "2025-01-01T03:12:59.544544Z",
     "shell.execute_reply.started": "2025-01-01T03:12:59.530647Z"
    },
    "trusted": true
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "<class 'pandas.core.frame.DataFrame'>\n",
      "RangeIndex: 100000 entries, 0 to 99999\n",
      "Columns: 207 entries, id to label\n",
      "dtypes: float16(206), float32(1)\n",
      "memory usage: 39.7 MB\n"
     ]
    }
   ],
   "source": [
    "train.info()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "info() 方法返回数据框的整体信息，包括：\n",
    "* 每列的名称。\n",
    "* 数据类型（如 int64、float64、object 等）。\n",
    "* 非空值的数量。\n",
    "* 数据框占用的内存大小。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 19,
   "metadata": {
    "execution": {
     "iopub.execute_input": "2025-01-01T03:12:59.546346Z",
     "iopub.status.busy": "2025-01-01T03:12:59.546154Z",
     "iopub.status.idle": "2025-01-01T03:12:59.569359Z",
     "shell.execute_reply": "2025-01-01T03:12:59.568597Z",
     "shell.execute_reply.started": "2025-01-01T03:12:59.546322Z"
    },
    "trusted": true
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "<class 'pandas.core.frame.DataFrame'>\n",
      "RangeIndex: 20000 entries, 0 to 19999\n",
      "Columns: 206 entries, id to s_204\n",
      "dtypes: float16(205), float32(1)\n",
      "memory usage: 7.9 MB\n"
     ]
    }
   ],
   "source": [
    "test.info()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "**结论**\n",
    "\n",
    "综上可知：\n",
    "* 主要的特征数据为 1 维信号振幅 (已被归一化至 0～1 了)，总长度均为 205 (205 个时间节点/心跳节拍)\n",
    "* 同时，除波形数据外，没有任何辅助或先验信息可以利用\n",
    "* 波形数据均已被量化为 float16 类型的数值型特征，且没有类别型特征需要考虑\n",
    "* 没有缺失值，无需填充，非常理想 —— 事实上，未采集到的信号默认振幅就是 0，故不存在缺失值的问题\n",
    "* 显然，这类非表格数据更适合用神经网络来处理，而非传统机器学习模型"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 查看类别分布"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 20,
   "metadata": {
    "execution": {
     "iopub.execute_input": "2025-01-01T03:12:59.570446Z",
     "iopub.status.busy": "2025-01-01T03:12:59.570202Z",
     "iopub.status.idle": "2025-01-01T03:12:59.845722Z",
     "shell.execute_reply": "2025-01-01T03:12:59.844897Z",
     "shell.execute_reply.started": "2025-01-01T03:12:59.570426Z"
    },
    "trusted": true
   },
   "outputs": [
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAjkAAAGdCAYAAADwjmIIAAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjEwLjMsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvZiW1igAAAAlwSFlzAAAPYQAAD2EBqD+naQAAJ9RJREFUeJzt3QlwFGX+//HvJOQUknAmRO5FQG4ByWbVVSRLZClLhFqRZV0KQQTjLocFmqoVZK+w4oVsBF1LQq2WgewWKrcs4Sgh3ETuLEoUVggRJeEwhBzPr57nX93/GUgwA2iYZ96vqqbT3d/p7nlopj909zPxKKWUAAAAWCakvncAAADgh0DIAQAAViLkAAAAKxFyAACAlQg5AADASoQcAABgJUIOAACwEiEHAABYqYEEserqajlx4oQ0atRIPB5Pfe8OAACoA/09xufOnZPExEQJCan9ek1QhxwdcFq3bl3fuwEAAK7B8ePHpVWrVrUuD+qQo6/gOI0UExNT37sDAADq4OzZs+YihXMer01QhxznFpUOOIQcAAACy/c9asKDxwAAwEqEHAAAYCVCDgAAsBIhBwAAWImQAwAArETIAQAAViLkAAAAKxFyAACAlQg5AADASoQcAABgJUIOAACwEiEHAABYiZADAACsRMgBAABWalDfO2Ct7/n17zclpep7DwAAuGG4kgMAAKxEyAEAAFYi5AAAACsRcgAAgJUIOQAAwEqEHAAAYCVCDgAAsBIhBwAAWImQAwAArETIAQAAViLkAAAAKxFyAACAlQg5AADASoQcAABgJUIOAACwEiEHAABYiZADAACsRMgBAABWIuQAAAAr+R1yvvrqK/nNb34jTZs2laioKOnRo4fs3LnTXa6UkhkzZkjLli3N8pSUFDly5IjPOr799lsZNWqUxMTESFxcnIwdO1bOnz/vU7N371655557JDIyUlq3bi0vvvjiFfuSk5MjXbp0MTV6P1auXOnv2wEAAJbyK+ScOXNG7rrrLgkLC5NVq1bJwYMH5eWXX5bGjRu7NTqMvP7667JgwQLZtm2b3HLLLZKamioXL150a3TAOXDggKxdu1aWL18umzZtkvHjx7vLz549K4MGDZK2bdvKrl27ZM6cOfLCCy/IW2+95dZs2bJFRo4caQLSnj17ZOjQoWbYv3//9bcKAAAIfMoPzz77rLr77rtrXV5dXa0SEhLUnDlz3HklJSUqIiJCvf/++2b64MGDSm92x44dbs2qVauUx+NRX331lZl+4403VOPGjVV5ebnPtjt37uxOP/LII2rIkCE+209KSlJPPvlknd9PaWmp2Rc9vuF00wbaAABAAKjr+duvKzkfffSR9OvXT371q19JixYt5I477pB//OMf7vLCwkIpKioyt6gcsbGxkpSUJHl5eWZaj/UtKr0eh64PCQkxV36cmp///OcSHh7u1uirQQUFBeZqklPjvR2nxtlOTcrLy81VIu8BAADYya+Qc/ToUZk/f77cdtttsmbNGpk4caL8/ve/l0WLFpnlOuBo8fHxPq/T084yPdYByVuDBg2kSZMmPjU1rcN7G7XVOMtrkpGRYUKXM+hnfQAAgJ38CjnV1dXSp08f+etf/2qu4ujnaJ544gnz/E0gSE9Pl9LSUnc4fvx4fe8SAAC4GUKO7jHVtWtXn3m33367HDt2zPyckJBgxqdOnfKp0dPOMj0uLi72WV5ZWWl6XHnX1LQO723UVuMsr0lERITp0eU9AAAAO/kVcnTPKv1cjLf//ve/pheU1r59exMy1q1b5y7Xz73oZ22Sk5PNtB6XlJSYXlOO3Nxcc5VIP7vj1OgeVxUVFW6N7onVuXNntyeXrvHejlPjbAcAAAQ5f55m3r59u2rQoIH6y1/+oo4cOaLee+89FR0drd599123Zvbs2SouLk59+OGHau/eveqhhx5S7du3V2VlZW7NAw88oO644w61bds29cknn6jbbrtNjRw50qdHVnx8vHrsscfU/v37VXZ2ttnOm2++6dZs3rzZ7MtLL72kDh06pGbOnKnCwsLUvn376vx+6F1F7yoAQOCp6/nb7zPbsmXLVPfu3U238C5duqi33nrrim7kzz//vAkpumbgwIGqoKDAp+abb74xoaZhw4YqJiZGjRkzRp07d86n5tNPPzXd1fU6br31VhOeLrdkyRLVqVMnFR4errp166ZWrFjh13sh5BByAACBp67nb4/+Q4KUvpWme1nph5Bv+PM5Ho8EnOA9FAAAFp6/+d1VAADASoQcAABgJUIOAACwEiEHAABYiZADAACsRMgBAABWIuQAAAArEXIAAICVCDkAAMBKhBwAAGAlQg4AALASIQcAAFiJkAMAAKxEyAEAAFYi5AAAACsRcgAAgJUIOQAAwEqEHAAAYCVC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yvLly01wGj9+vLv87NmzMmjQIGnbtq3s2rVL5syZIy+88IK89dZbbs2WLVtk5MiRJiDt2bNHhg4daob9+/f73woAAMA+6jroly9dutSdrq6uVgkJCWrOnDnuvJKSEhUREaHef/99M33w4EHzuh07drg1q1atUh6PR3311Vdm+o033lCNGzdW5eXlbs2zzz6rOnfu7E4/8sgjasiQIT77k5SUpJ588sk6739paanZFz2+4XTTBtoAoP7V9+cAnx03r/r+e5ab59io6/n7hj6TU1hYKEVFReYWlSM2NlaSkpIkLy/PTOuxvkXVr18/t0bXh4SEmCs/Ts3Pf/5zCQ8Pd2v01aCCggI5c+aMW+O9HafG2Q4AAAhuDW7kynTA0eLj433m62lnmR63aNHCdycaNJAmTZr41LRv3/6KdTjLGjdubMZX205NysvLzeB9WwwAANgpqHpXZWRkmCtLzqAfaAYAAHa6oSEnISHBjE+dOuUzX087y/S4uLjYZ3llZaXpceVdU9M6vLdRW42zvCbp6elSWlrqDsePH7+OdwsAAIIm5OhbTDpkrFu3zueWkH7WJjk52UzrcUlJiek15cjNzZXq6mrz7I5To3tcVVRUuDW6J1bnzp3NrSqnxns7To2znZpERESYbuveAwAAsJPfIUd/n01+fr4ZnIeN9c/Hjh0z35szefJk+fOf/ywfffSR7Nu3T37729+a79TR3bu122+/XR544AF54oknZPv27bJ582Z5+umn5dFHHzV12q9//Wvz0LHuHq67mi9evFjmzp0rU6dOdfdj0qRJsnr1ann55Zfl8OHDpov5zp07zboAAAD87t+1fv16023r8mH06NFuN/Lnn39excfHm67jAwcOVAUFBT7r+Oabb9TIkSNVw4YNVUxMjBozZow6d+6cT82nn36q7r77brOOW2+9Vc2ePfuKfVmyZInq1KmTCg8PV926dVMrVqzw673QhZxuoMBNp74/B/jsuHnV99+z3DzHRl3P357/127BSd9K0w8g6+dzbvitK49HAk7wHgrAzYPPDtSGY8Pv83dQ9a4CAADBg5ADAACsRMgBAABWIuQAAAArEXIAAICVCDkAAMBKhBwAAGAlQg4AALASIQcAAFiJkAMAAKxEyAEAAFYi5AAAACsRcgAAgJUIOQAAwEqEHAAAYCVCDgAAsBIhBwAAWImQAwAA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",
      "text/plain": [
       "<Figure size 640x480 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "plt.hist(train['label'], orientation = 'vertical', histtype = 'bar', color = 'red')\n",
    "plt.show() "
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "对训练集 train 中的 label 列（目标变量）绘制柱状图（直方图），以可视化每个类别的分布情况"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "**结论**\n",
    "\n",
    "* 从柱状图可以发现类别 0 的样本数量远多于其他类别。\n",
    "* 类别不平衡可能会影响模型的训练效果，需要采取措施处理（如过采样、下采样或调整类别权重）。"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "**用 SMOTE 对少数类别上采样效果最好：**"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 21,
   "metadata": {
    "execution": {
     "iopub.execute_input": "2025-01-01T03:12:59.846838Z",
     "iopub.status.busy": "2025-01-01T03:12:59.846545Z",
     "iopub.status.idle": "2025-01-01T03:13:11.928781Z",
     "shell.execute_reply": "2025-01-01T03:13:11.928079Z",
     "shell.execute_reply.started": "2025-01-01T03:12:59.846807Z"
    },
    "trusted": true
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "after smote, k_x_train.shape: (257308, 205), k_y_train.shape: (257308,)\n"
     ]
    },
    {
     "data": {
      "image/png": "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k5KS4uzfv9956aWXnIoVKzrZ2dlme79+/Zxx48Z56rds2eKEhYU5f/rTn5wDBw44SUlJTunSpZ09e/Y4tvP3Wk2aNMlZu3at89133zmZmZlO7969ncjISGffvn2O7c6dO+fs2rXLLPpPc/r06ebrH374wWzX66TXy/X99987ZcuWdcaMGWPaVXJyslOqVClnzZo1ju38vVYzZsxwli9f7hw+fNj8uxs5cqQTGhrq/P3vf3dsN2zYMDP7Z+PGjc6JEyc8y//+9z9PDT+zbv9aBevPrHHjxplZZ1lZWc4333xj1kNCQpx169bdU22KkHOb/vznPzv16tVzwsPDzTTpbdu2ebb93//9n9O/f3+f+iVLljgPPPCAqddpv6tWrXKChT/XKjEx0VNbo0YN55lnnnF27tzpBAN3mvP1i3t99FWv1/WfadWqlble9913n5nOGgz8vVZ//OMfnV/84hfml0/lypWdJ554wtmwYYMTDAq7Trp4txV+Zt3+tQrWn1kDBw506tevb77vatWqOZ07d/YEnHupTYXo//y8fUUAAADFjzE5AADASoQcAABgJUIOAACwEiEHAABYiZADAACsRMgBAABWIuQAAAArEXIAAICVCDkAAMBKhBwAAGAlQg4AALASIQcAAIiN/h/llq/rNs6r9wAAAABJRU5ErkJggg==",
      "text/plain": [
       "<Figure size 640x480 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "import warnings\n",
    "warnings.filterwarnings(\"ignore\", category=FutureWarning)\n",
    "\n",
    "# 使用 SMOTE 对数据进行上采样以解决类别不平衡问题\n",
    "smote = SMOTE(random_state=2021)\n",
    "k_x_train, k_y_train = smote.fit_resample(x_train, y_train)  \n",
    "print(f\"after smote, k_x_train.shape: {k_x_train.shape}, k_y_train.shape: {k_y_train.shape}\")\n",
    "# 将训练集转换为适应 CNN 输入的 shape\n",
    "k_x_train = np.array(k_x_train).reshape(k_x_train.shape[0], k_x_train.shape[1], 1)\n",
    "\n",
    "plt.hist(k_y_train, orientation = 'vertical', histtype = 'bar', color = 'green')\n",
    "plt.show() "
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 辅助函数"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 22,
   "metadata": {
    "execution": {
     "iopub.execute_input": "2025-01-01T03:13:11.929765Z",
     "iopub.status.busy": "2025-01-01T03:13:11.929566Z",
     "iopub.status.idle": "2025-01-01T03:13:11.933751Z",
     "shell.execute_reply": "2025-01-01T03:13:11.932815Z",
     "shell.execute_reply.started": "2025-01-01T03:13:11.929748Z"
    },
    "trusted": true
   },
   "outputs": [],
   "source": [
    "# 评估函数\n",
    "def abs_sum(y_pred, y_true):\n",
    "    y_pred = np.array(y_pred)\n",
    "    y_true = np.array(y_true)\n",
    "    loss = sum(sum(abs(y_pred-y_true)))\n",
    "    return loss"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "用于计算模型预测结果和真实标签之间的误差的绝对值之和（absolute sum）"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 模型训练与推理"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "**为何使用简单网络**\n",
    "* 数据特征单一，复杂网络易过拟合。\n",
    "* 通过 Dropout 和池化层平衡了模型复杂度。"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": []
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Net 1"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 23,
   "metadata": {
    "execution": {
     "iopub.execute_input": "2025-01-01T03:13:11.934805Z",
     "iopub.status.busy": "2025-01-01T03:13:11.934566Z",
     "iopub.status.idle": "2025-01-01T03:13:11.952224Z",
     "shell.execute_reply": "2025-01-01T03:13:11.951465Z",
     "shell.execute_reply.started": "2025-01-01T03:13:11.934779Z"
    },
    "trusted": true
   },
   "outputs": [],
   "source": [
    "class Net1(K.Model):\n",
    "    def __init__(self):\n",
    "        super(Net1, self).__init__()\n",
    "        self.conv1 = Conv1D(filters=16, kernel_size=3, padding='same', activation='relu', input_shape = (205, 1))\n",
    "        self.conv2 = Conv1D(filters=32, kernel_size=3, dilation_rate=2, padding='same', activation='relu')\n",
    "        self.conv3 = Conv1D(filters=64, kernel_size=3, dilation_rate=2, padding='same', activation='relu')\n",
    "        self.conv4 = Conv1D(filters=64, kernel_size=5, dilation_rate=2, padding='same', activation='relu')\n",
    "        self.max_pool1 = MaxPool1D(pool_size=3, strides=2, padding='same')\n",
    "        \n",
    "        self.conv5 = Conv1D(filters=128, kernel_size=5, dilation_rate=2, padding='same', activation='relu')\n",
    "        self.conv6 = Conv1D(filters=128, kernel_size=5, dilation_rate=2, padding='same', activation='relu')\n",
    "        self.max_pool2 = MaxPool1D(pool_size=3, strides=2, padding='same')\n",
    "        \n",
    "        self.dropout = Dropout(0.5)\n",
    "        self.flatten = Flatten()\n",
    "        \n",
    "        self.fc1 = Dense(units=256, activation='relu')\n",
    "        self.fc21 = Dense(units=16, activation='relu')\n",
    "        self.fc22 = Dense(units=256, activation='sigmoid')\n",
    "        self.fc3 = Dense(units=4, activation='softmax')\n",
    "            \n",
    "    def call(self, x):\n",
    "        x = self.conv1(x)\n",
    "        x = self.conv2(x)\n",
    "        x = self.conv3(x)\n",
    "        x = self.conv4(x)\n",
    "        x = self.max_pool1(x)\n",
    "        \n",
    "        x = self.conv5(x)\n",
    "        x = self.conv6(x) \n",
    "        x = self.max_pool2(x)\n",
    "        \n",
    "        x = self.dropout(x)\n",
    "        x = self.flatten(x)\n",
    "        \n",
    "        x1 = self.fc1(x)\n",
    "        x2 = self.fc22(self.fc21(x))\n",
    "        x = self.fc3(x1+x2)\n",
    "        \n",
    "        return x "
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "1. 输入数据：\n",
    "   形状为 (batch_size, 205, 1)，表示 205 个时间点的单通道信号。\n",
    "2. 卷积层：\n",
    "   使用膨胀卷积扩大感受野，提取时间序列中的局部和全局特征。\n",
    "   卷积核大小分别为 3 和 5，层间特征数逐步增加。\n",
    "3. 池化层：\n",
    "   下采样，减少特征维度。\n",
    "4. Dropout：\n",
    "   随机丢弃部分神经元，防止过拟合。\n",
    "5. 全连接层：\n",
    "    分支1 提取补充特征。主分支和分支结果相加。\n",
    "6. 输出层：\n",
    "    使用 Softmax 输出分类概率，最终实现 4 类心跳信号分类。\n",
    "\n",
    "```python\n",
    "1. 输入数据，形状为 (batch_size, 205, 1)\n",
    "\n",
    "2. 第一组卷积\n",
    "x = Conv1D(16, kernel_size=3, activation='relu', padding='same')(input)  \n",
    "x = Conv1D(32, kernel_size=3, activation='relu', dilation_rate=2, padding='same')(x)\n",
    "x = Conv1D(64, kernel_size=3, activation='relu', dilation_rate=2, padding='same')(x)\n",
    "x = Conv1D(64, kernel_size=5, activation='relu', dilation_rate=2, padding='same')(x)\n",
    "x = MaxPooling1D(pool_size=3, strides=2, padding='same')(x)  # 下采样\n",
    "\n",
    "3. 第二组卷积\n",
    "x = Conv1D(128, kernel_size=5, activation='relu', dilation_rate=2, padding='same')(x)\n",
    "x = Conv1D(128, kernel_size=5, activation='relu', dilation_rate=2, padding='same')(x)\n",
    "x = MaxPooling1D(pool_size=3, strides=2, padding='same')(x)  # 下采样\n",
    "\n",
    "4. Dropout 防止过拟合\n",
    "x = Dropout(rate=0.5)(x)\n",
    "\n",
    "5. 全连接层\n",
    "x = Flatten()(x)  # 拉平多维数据\n",
    "x1 = Dense(256, activation='relu')(x)  # 主分支\n",
    "x2 = Dense(16, activation='relu')(x)  # 分支1\n",
    "x2 = Dense(256, activation='sigmoid')(x2)  # 分支2\n",
    "\n",
    "6. 合并分支，输出分类\n",
    "x = x1 + x2\n",
    "output = Dense(4, activation='softmax')(x)  # 输出4分类结果\n",
    "\n",
    "7. 返回输出\n",
    "return output\n",
    "\n",
    "```"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Net2"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": 24,
   "metadata": {
    "execution": {
     "iopub.execute_input": "2025-01-01T03:13:11.955411Z",
     "iopub.status.busy": "2025-01-01T03:13:11.955192Z",
     "iopub.status.idle": "2025-01-01T03:13:11.973924Z",
     "shell.execute_reply": "2025-01-01T03:13:11.973177Z",
     "shell.execute_reply.started": "2025-01-01T03:13:11.955392Z"
    },
    "trusted": true
   },
   "outputs": [],
   "source": [
    "class GeMPooling(tf.keras.layers.Layer):\n",
    "    def __init__(self, p=1.0, train_p=False):\n",
    "        super().__init__()\n",
    "        self.eps = 1e-6\n",
    "        self.p = tf.Variable(p, dtype=tf.float32) if train_p else p\n",
    "\n",
    "    def call(self, inputs: tf.Tensor, **kwargs):\n",
    "        inputs = tf.clip_by_value(inputs, clip_value_min=1e-6, clip_value_max=tf.reduce_max(inputs))\n",
    "        inputs = tf.pow(inputs, self.p)\n",
    "        inputs = tf.reduce_mean(inputs, axis=[1], keepdims=False)\n",
    "        inputs = tf.pow(inputs, 1./self.p)\n",
    "        return inputs\n",
    "\n",
    "\n",
    "class Net2(K.Model):\n",
    "    def __init__(self):\n",
    "        super(Net2, self).__init__()\n",
    "        self.conv1 = Conv1D(filters=16, kernel_size=3, padding='same', activation='relu', input_shape = (205, 1))\n",
    "        self.conv2 = Conv1D(filters=32, kernel_size=3, dilation_rate=2, padding='same', activation='relu')\n",
    "        self.conv3 = Conv1D(filters=64, kernel_size=3, dilation_rate=2, padding='same', activation='relu')\n",
    "        self.max_pool1 = MaxPool1D(pool_size=3, strides=2, padding='same')\n",
    "        \n",
    "        self.conv4 = Conv1D(filters=64, kernel_size=5, dilation_rate=2, padding='same', activation='relu')\n",
    "        self.conv5 = Conv1D(filters=128, kernel_size=5, dilation_rate=2, padding='same', activation='relu')\n",
    "        self.max_pool2 = MaxPool1D(pool_size=3, strides=2, padding='same')\n",
    "        \n",
    "        self.conv6 = Conv1D(filters=256, kernel_size=5, dilation_rate=2, padding='same', activation='relu')\n",
    "        self.conv7 = Conv1D(filters=128, kernel_size=7, dilation_rate=2, padding='same', activation='relu')\n",
    "        self.gempool = GeMPooling()\n",
    "        \n",
    "        self.dropout1 = Dropout(0.5)\n",
    "        self.flatten = Flatten()\n",
    "\n",
    "        self.fc1 = Dense(units=256, activation='relu')\n",
    "        self.fc21 = Dense(units=16, activation='relu')\n",
    "        self.fc22 = Dense(units=256, activation='sigmoid')\n",
    "        self.fc3 = Dense(units=4, activation='softmax')\n",
    "\n",
    "    def call(self, x):\n",
    "        x = self.conv1(x)\n",
    "        x = self.conv2(x)\n",
    "        x = self.conv3(x)\n",
    "        x = self.max_pool1(x)\n",
    "        \n",
    "        x = self.conv4(x)\n",
    "        x = self.conv5(x)\n",
    "        x = self.max_pool2(x)\n",
    "        \n",
    "        x = self.conv6(x)\n",
    "        x = self.conv7(x)\n",
    "\n",
    "        x = self.gempool(x)\n",
    "        x = self.dropout1(x)\n",
    "        \n",
    "        x = self.flatten(x)  \n",
    "        x1 = self.fc1(x)\n",
    "        x2 = self.fc22(self.fc21(x))\n",
    "        x = self.fc3(x1 + x2)  \n",
    "        \n",
    "        return x"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "**核心流程总结**\n",
    "1. 输入：形状为 `(batch_size, 205, 1)`。\n",
    "2. 卷积：\n",
    "   - 提取局部和全局特征，使用膨胀卷积扩大感受野。\n",
    "3. 池化：\n",
    "   - 使用最大池化减少特征维度，降低计算复杂度。\n",
    "4. GeMPooling：\n",
    "   - 灵活调整池化方式，进一步整合全局特征。\n",
    "5. Dropout：\n",
    "   - 随机丢弃神经元，防止过拟合。\n",
    "6. 全连接：\n",
    "   - 提取高阶特征，分支特征整合后输出分类结果。\n",
    "\n",
    "---\n",
    "\n",
    "```python\n",
    "# 初始化模型\n",
    "class Net2:\n",
    "    def __init__():\n",
    "        # 定义卷积层组1\n",
    "        Conv1D(filters=16, kernel_size=3, activation='relu')\n",
    "        Conv1D(filters=32, kernel_size=3, dilation_rate=2, activation='relu')\n",
    "        Conv1D(filters=64, kernel_size=3, dilation_rate=2, activation='relu')\n",
    "        MaxPooling1D(pool_size=3, strides=2)\n",
    "\n",
    "        # 定义卷积层组2\n",
    "        Conv1D(filters=64, kernel_size=5, dilation_rate=2, activation='relu')\n",
    "        Conv1D(filters=128, kernel_size=5, dilation_rate=2, activation='relu')\n",
    "        MaxPooling1D(pool_size=3, strides=2)\n",
    "\n",
    "        # 定义卷积层组3\n",
    "        Conv1D(filters=256, kernel_size=5, dilation_rate=2, activation='relu')\n",
    "        Conv1D(filters=128, kernel_size=7, dilation_rate=2, activation='relu')\n",
    "\n",
    "        # 定义 GeMPooling 层\n",
    "        GeMPooling()\n",
    "\n",
    "        # Dropout 层\n",
    "        Dropout(rate=0.5)\n",
    "\n",
    "        # 全连接层\n",
    "        Dense(units=256, activation='relu')\n",
    "        Dense(units=16, activation='relu')  # 分支1\n",
    "        Dense(units=256, activation='sigmoid')  # 分支2\n",
    "        Dense(units=4, activation='softmax')  # 输出层\n",
    "\n",
    "    # 前向传播\n",
    "    def call(input):\n",
    "        # 卷积层组1\n",
    "        x = Conv1D(filters=16, kernel_size=3)(input)\n",
    "        x = Conv1D(filters=32, kernel_size=3, dilation_rate=2)(x)\n",
    "        x = Conv1D(filters=64, kernel_size=3, dilation_rate=2)(x)\n",
    "        x = MaxPooling1D(pool_size=3, strides=2)(x)\n",
    "\n",
    "        # 卷积层组2\n",
    "        x = Conv1D(filters=64, kernel_size=5, dilation_rate=2)(x)\n",
    "        x = Conv1D(filters=128, kernel_size=5, dilation_rate=2)(x)\n",
    "        x = MaxPooling1D(pool_size=3, strides=2)(x)\n",
    "\n",
    "        # 卷积层组3\n",
    "        x = Conv1D(filters=256, kernel_size=5, dilation_rate=2)(x)\n",
    "        x = Conv1D(filters=128, kernel_size=7, dilation_rate=2)(x)\n",
    "\n",
    "        # 使用 GeMPooling\n",
    "        x = GeMPooling()(x)\n",
    "\n",
    "        # Dropout\n",
    "        x = Dropout(rate=0.5)(x)\n",
    "\n",
    "        # 扁平化数据\n",
    "        x = Flatten()(x)\n",
    "\n",
    "        # 全连接层\n",
    "        x1 = Dense(units=256, activation='relu')(x)  # 主分支\n",
    "        x2 = Dense(units=16, activation='relu')(x)  # 分支1\n",
    "        x2 = Dense(units=256, activation='sigmoid')(x2)  # 分支2\n",
    "\n",
    "        # 合并分支并输出\n",
    "        output = Dense(units=4, activation='softmax')(x1 + x2)\n",
    "        return output\n",
    "```"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Net3"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Net3 是一个通过 膨胀卷积 和 多池化策略 增强特征提取能力的 CNN 模型"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 25,
   "metadata": {
    "execution": {
     "iopub.execute_input": "2025-01-01T03:13:11.975265Z",
     "iopub.status.busy": "2025-01-01T03:13:11.974983Z",
     "iopub.status.idle": "2025-01-01T03:13:11.992095Z",
     "shell.execute_reply": "2025-01-01T03:13:11.991441Z",
     "shell.execute_reply.started": "2025-01-01T03:13:11.975242Z"
    },
    "trusted": true
   },
   "outputs": [],
   "source": [
    "class Net3(K.Model): \n",
    "    def __init__(self):\n",
    "        super(Net3, self).__init__()\n",
    "        self.conv1 = Conv1D(filters=16, kernel_size=3, padding='same', activation='relu',input_shape = (205, 1))\n",
    "        self.conv2 = Conv1D(filters=32, kernel_size=3, padding='same', dilation_rate=2, activation='relu')\n",
    "        self.conv3 = Conv1D(filters=64, kernel_size=3, padding='same', dilation_rate=2, activation='relu')\n",
    "        self.conv4 = Conv1D(filters=128, kernel_size=3, padding='same', dilation_rate=2, activation='relu')\n",
    "        self.conv5 = Conv1D(filters=128, kernel_size=5, padding='same', dilation_rate=2, activation='relu')\n",
    "        self.max_pool1 = MaxPool1D(pool_size=3, strides=2, padding='same')\n",
    "        self.avg_pool1 = AvgPool1D(pool_size=3, strides=2, padding='same')\n",
    "        \n",
    "        self.conv6 = Conv1D(filters=128, kernel_size=5, padding='same', dilation_rate=2, activation='relu')\n",
    "        self.conv7 = Conv1D(filters=128, kernel_size=5, padding='same', dilation_rate=2,  activation='relu')\n",
    "        self.max_pool2 = MaxPool1D(pool_size=3, strides=2, padding='same')\n",
    "        self.avg_pool2 = AvgPool1D(pool_size=3, strides=2, padding='same')\n",
    "        \n",
    "        self.dropout = Dropout(0.5)\n",
    "    \n",
    "        self.flatten = Flatten()\n",
    "        \n",
    "        self.fc1 = Dense(units=256, activation='relu')\n",
    "        self.fc21 = Dense(units=16, activation='relu')\n",
    "        self.fc22 = Dense(units=256, activation='sigmoid')\n",
    "        self.fc3 = Dense(units=4, activation='softmax')\n",
    "            \n",
    "    def call(self, x):\n",
    "        x = self.conv1(x)\n",
    "        x = self.conv2(x)\n",
    "        x = self.conv3(x)\n",
    "        x = self.conv4(x)\n",
    "        x = self.conv5(x)\n",
    "        xm1 = self.max_pool1(x)\n",
    "        xa1 = self.avg_pool1(x)\n",
    "        x = tf.concat([xm1, xa1], 2)\n",
    "        \n",
    "        x = self.conv6(x)\n",
    "        x = self.conv7(x) \n",
    "        xm2 = self.max_pool2(x)\n",
    "        xa2 = self.avg_pool2(x)\n",
    "        x = tf.concat([xm2, xa2], 2)\n",
    "        \n",
    "        x = self.dropout(x)\n",
    "        x = self.flatten(x)\n",
    "        \n",
    "        x1 = self.fc1(x)\n",
    "        x2 = self.fc22(self.fc21(x))\n",
    "        x = self.fc3(x1+x2)\n",
    "        \n",
    "        return x "
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "**流程总结**\n",
    "1. **输入**：形状为 `(batch_size, 205, 1)` 的时间序列信号。\n",
    "2. **卷积+膨胀卷积**：逐步提取局部和全局特征，扩大感受野。\n",
    "3. **最大池化 + 平均池化融合**：结合不同的池化策略，拼接多种特征。\n",
    "4. **Dropout**：随机丢弃神经元，防止过拟合。\n",
    "5. **全连接层**：通过主分支和分支特征相加，提升模型表现力。\n",
    "6. **输出**：使用 Softmax 输出 4 类分类概率。\n",
    "\n",
    "---\n",
    "\n",
    "```python\n",
    "# 定义 Net3 模型\n",
    "class Net3:\n",
    "    def __init__():\n",
    "        # 第一组卷积层\n",
    "        Conv1D(filters=16, kernel_size=3, activation='relu')  # 提取基础特征\n",
    "        Conv1D(filters=32, kernel_size=3, dilation_rate=2, activation='relu')  # 扩大感受野\n",
    "        Conv1D(filters=64, kernel_size=3, dilation_rate=2, activation='relu')\n",
    "        Conv1D(filters=128, kernel_size=3, dilation_rate=2, activation='relu')\n",
    "        Conv1D(filters=128, kernel_size=5, dilation_rate=2, activation='relu')\n",
    "        MaxPooling1D(pool_size=3, strides=2)  # 最大池化\n",
    "        AvgPooling1D(pool_size=3, strides=2)  # 平均池化\n",
    "\n",
    "        # 第二组卷积层\n",
    "        Conv1D(filters=128, kernel_size=5, dilation_rate=2, activation='relu')  # 提取深层特征\n",
    "        Conv1D(filters=128, kernel_size=5, dilation_rate=2, activation='relu')\n",
    "        MaxPooling1D(pool_size=3, strides=2)  # 最大池化\n",
    "        AvgPooling1D(pool_size=3, strides=2)  # 平均池化\n",
    "\n",
    "        # Dropout 防止过拟合\n",
    "        Dropout(rate=0.5)\n",
    "\n",
    "        # 全连接层\n",
    "        Dense(units=256, activation='relu')  # 主分支\n",
    "        Dense(units=16, activation='relu')  # 分支1\n",
    "        Dense(units=256, activation='sigmoid')  # 分支2\n",
    "        Dense(units=4, activation='softmax')  # 输出层\n",
    "\n",
    "    def call(input):\n",
    "        # 第一组卷积层处理\n",
    "        x = Conv1D(filters=16, kernel_size=3)(input)\n",
    "        x = Conv1D(filters=32, kernel_size=3, dilation_rate=2)(x)\n",
    "        x = Conv1D(filters=64, kernel_size=3, dilation_rate=2)(x)\n",
    "        x = Conv1D(filters=128, kernel_size=3, dilation_rate=2)(x)\n",
    "        x = Conv1D(filters=128, kernel_size=5, dilation_rate=2)(x)\n",
    "\n",
    "        # 第一组池化融合（最大池化 + 平均池化）\n",
    "        xm1 = MaxPooling1D(pool_size=3, strides=2)(x)\n",
    "        xa1 = AvgPooling1D(pool_size=3, strides=2)(x)\n",
    "        x = Concatenate(axis=2)([xm1, xa1])  # 拼接池化结果\n",
    "\n",
    "        # 第二组卷积层处理\n",
    "        x = Conv1D(filters=128, kernel_size=5, dilation_rate=2)(x)\n",
    "        x = Conv1D(filters=128, kernel_size=5, dilation_rate=2)(x)\n",
    "\n",
    "        # 第二组池化融合（最大池化 + 平均池化）\n",
    "        xm2 = MaxPooling1D(pool_size=3, strides=2)(x)\n",
    "        xa2 = AvgPooling1D(pool_size=3, strides=2)(x)\n",
    "        x = Concatenate(axis=2)([xm2, xa2])\n",
    "\n",
    "        # Dropout 防止过拟合\n",
    "        x = Dropout(rate=0.5)(x)\n",
    "\n",
    "        # 全连接层处理\n",
    "        x = Flatten()(x)  # 拉平数据\n",
    "        x1 = Dense(units=256, activation='relu')(x)  # 主分支特征\n",
    "        x2 = Dense(units=16, activation='relu')(x)  # 分支1\n",
    "        x2 = Dense(units=256, activation='sigmoid')(x2)  # 分支2\n",
    "        output = Dense(units=4, activation='softmax')(x1 + x2)  # 分支特征相加后输出分类\n",
    "\n",
    "        return output\n",
    "```"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 训练模型"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 26,
   "metadata": {
    "execution": {
     "iopub.execute_input": "2025-01-01T03:13:11.993082Z",
     "iopub.status.busy": "2025-01-01T03:13:11.992778Z",
     "iopub.status.idle": "2025-01-01T03:33:53.628056Z",
     "shell.execute_reply": "2025-01-01T03:33:53.627242Z",
     "shell.execute_reply.started": "2025-01-01T03:13:11.993060Z"
    },
    "trusted": true
   },
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "d:\\桌面\\heart-beat-prediction-master\\.venv\\Lib\\site-packages\\keras\\src\\layers\\convolutional\\base_conv.py:113: UserWarning: Do not pass an `input_shape`/`input_dim` argument to a layer. When using Sequential models, prefer using an `Input(shape)` object as the first layer in the model instead.\n",
      "  super().__init__(activity_regularizer=activity_regularizer, **kwargs)\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Epoch 1/30\n",
      "\u001b[1m1006/1006\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m119s\u001b[0m 116ms/step - accuracy: 0.8040 - loss: 0.5472 - val_accuracy: 0.9642 - val_loss: 0.1005 - learning_rate: 0.0100\n",
      "Epoch 2/30\n",
      "\u001b[1m1006/1006\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m112s\u001b[0m 111ms/step - accuracy: 0.9601 - loss: 0.1186 - val_accuracy: 0.9596 - val_loss: 0.1094 - learning_rate: 0.0100\n",
      "Epoch 3/30\n",
      "\u001b[1m1006/1006\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m108s\u001b[0m 108ms/step - accuracy: 0.9673 - loss: 0.0989 - val_accuracy: 0.9836 - val_loss: 0.0475 - learning_rate: 0.0100\n",
      "Epoch 4/30\n",
      "\u001b[1m1006/1006\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m133s\u001b[0m 132ms/step - accuracy: 0.9779 - loss: 0.0671 - val_accuracy: 0.9872 - val_loss: 0.0388 - learning_rate: 0.0100\n",
      "Epoch 5/30\n",
      "\u001b[1m1006/1006\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m142s\u001b[0m 141ms/step - accuracy: 0.9781 - loss: 0.0667 - val_accuracy: 0.9893 - val_loss: 0.0334 - learning_rate: 0.0100\n",
      "Epoch 6/30\n",
      "\u001b[1m1006/1006\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m146s\u001b[0m 145ms/step - accuracy: 0.9822 - loss: 0.0528 - val_accuracy: 0.9890 - val_loss: 0.0319 - learning_rate: 0.0100\n",
      "Epoch 7/30\n",
      "\u001b[1m1006/1006\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m145s\u001b[0m 144ms/step - accuracy: 0.9842 - loss: 0.0490 - val_accuracy: 0.9655 - val_loss: 0.1019 - learning_rate: 0.0100\n",
      "Epoch 8/30\n",
      "\u001b[1m1006/1006\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m148s\u001b[0m 147ms/step - accuracy: 0.9794 - loss: 0.0634 - val_accuracy: 0.9913 - val_loss: 0.0255 - learning_rate: 0.0100\n",
      "Epoch 9/30\n",
      "\u001b[1m1006/1006\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m142s\u001b[0m 142ms/step - accuracy: 0.9870 - loss: 0.0402 - val_accuracy: 0.9870 - val_loss: 0.0400 - learning_rate: 0.0100\n",
      "Epoch 10/30\n",
      "\u001b[1m1006/1006\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m144s\u001b[0m 143ms/step - accuracy: 0.9844 - loss: 0.0499 - val_accuracy: 0.9873 - val_loss: 0.0377 - learning_rate: 0.0100\n",
      "Epoch 11/30\n",
      "\u001b[1m1006/1006\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m144s\u001b[0m 143ms/step - accuracy: 0.9939 - loss: 0.0189 - val_accuracy: 0.9944 - val_loss: 0.0172 - learning_rate: 0.0050\n",
      "Epoch 12/30\n",
      "\u001b[1m1006/1006\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m144s\u001b[0m 143ms/step - accuracy: 0.9953 - loss: 0.0135 - val_accuracy: 0.9965 - val_loss: 0.0111 - learning_rate: 0.0050\n",
      "Epoch 13/30\n",
      "\u001b[1m1006/1006\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m151s\u001b[0m 150ms/step - accuracy: 0.9945 - loss: 0.0168 - val_accuracy: 0.9952 - val_loss: 0.0147 - learning_rate: 0.0050\n",
      "Epoch 14/30\n",
      "\u001b[1m1006/1006\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m154s\u001b[0m 154ms/step - accuracy: 0.9949 - loss: 0.0169 - val_accuracy: 0.9980 - val_loss: 0.0059 - learning_rate: 0.0050\n",
      "Epoch 15/30\n",
      "\u001b[1m1006/1006\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m152s\u001b[0m 151ms/step - accuracy: 0.9960 - loss: 0.0137 - val_accuracy: 0.9928 - val_loss: 0.0233 - learning_rate: 0.0050\n",
      "Epoch 16/30\n",
      "\u001b[1m1006/1006\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m149s\u001b[0m 148ms/step - accuracy: 0.9946 - loss: 0.0161 - val_accuracy: 0.9964 - val_loss: 0.0116 - learning_rate: 0.0050\n",
      "Epoch 17/30\n",
      "\u001b[1m1006/1006\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m150s\u001b[0m 149ms/step - accuracy: 0.9956 - loss: 0.0137 - val_accuracy: 0.9955 - val_loss: 0.0151 - learning_rate: 0.0050\n",
      "Epoch 18/30\n",
      "\u001b[1m1006/1006\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m152s\u001b[0m 151ms/step - accuracy: 0.9929 - loss: 0.0251 - val_accuracy: 0.9974 - val_loss: 0.0087 - learning_rate: 0.0050\n",
      "Epoch 19/30\n",
      "\u001b[1m1006/1006\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m150s\u001b[0m 149ms/step - accuracy: 0.9954 - loss: 0.0147 - val_accuracy: 0.9952 - val_loss: 0.0156 - learning_rate: 0.0050\n",
      "Epoch 20/30\n",
      "\u001b[1m1006/1006\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m148s\u001b[0m 148ms/step - accuracy: 0.9955 - loss: 0.0141 - val_accuracy: 0.9967 - val_loss: 0.0114 - learning_rate: 0.0050\n",
      "Epoch 21/30\n",
      "\u001b[1m1006/1006\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m147s\u001b[0m 146ms/step - accuracy: 0.9981 - loss: 0.0056 - val_accuracy: 0.9987 - val_loss: 0.0044 - learning_rate: 0.0025\n",
      "Epoch 22/30\n",
      "\u001b[1m1006/1006\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m153s\u001b[0m 152ms/step - accuracy: 0.9989 - loss: 0.0037 - val_accuracy: 0.9987 - val_loss: 0.0045 - learning_rate: 0.0025\n",
      "Epoch 23/30\n",
      "\u001b[1m1006/1006\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m146s\u001b[0m 145ms/step - accuracy: 0.9987 - loss: 0.0041 - val_accuracy: 0.9986 - val_loss: 0.0056 - learning_rate: 0.0025\n",
      "Epoch 24/30\n",
      "\u001b[1m1006/1006\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m147s\u001b[0m 146ms/step - accuracy: 0.9992 - loss: 0.0030 - val_accuracy: 0.9985 - val_loss: 0.0053 - learning_rate: 0.0025\n",
      "Epoch 25/30\n",
      "\u001b[1m1006/1006\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m154s\u001b[0m 153ms/step - accuracy: 0.9991 - loss: 0.0035 - val_accuracy: 0.9980 - val_loss: 0.0083 - learning_rate: 0.0025\n",
      "Epoch 26/30\n",
      "\u001b[1m1006/1006\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m146s\u001b[0m 145ms/step - accuracy: 0.9988 - loss: 0.0040 - val_accuracy: 0.9982 - val_loss: 0.0062 - learning_rate: 0.0025\n",
      "Epoch 27/30\n",
      "\u001b[1m1006/1006\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m150s\u001b[0m 149ms/step - accuracy: 0.9988 - loss: 0.0039 - val_accuracy: 0.9988 - val_loss: 0.0059 - learning_rate: 0.0025\n",
      "Epoch 28/30\n",
      "\u001b[1m1006/1006\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m139s\u001b[0m 138ms/step - accuracy: 0.9989 - loss: 0.0038 - val_accuracy: 0.9988 - val_loss: 0.0053 - learning_rate: 0.0025\n",
      "Epoch 29/30\n",
      "\u001b[1m1006/1006\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m137s\u001b[0m 136ms/step - accuracy: 0.9987 - loss: 0.0042 - val_accuracy: 0.9988 - val_loss: 0.0052 - learning_rate: 0.0025\n",
      "Epoch 30/30\n",
      "\u001b[1m1006/1006\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m123s\u001b[0m 122ms/step - accuracy: 0.9992 - loss: 0.0030 - val_accuracy: 0.9988 - val_loss: 0.0058 - learning_rate: 0.0025\n",
      "Epoch 1/30\n",
      "\u001b[1m1006/1006\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m148s\u001b[0m 144ms/step - accuracy: 0.7126 - loss: 0.6858 - val_accuracy: 0.9051 - val_loss: 0.2778\n",
      "Epoch 2/30\n",
      "\u001b[1m1006/1006\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m136s\u001b[0m 135ms/step - accuracy: 0.9421 - loss: 0.1651 - val_accuracy: 0.9680 - val_loss: 0.0921\n",
      "Epoch 3/30\n",
      "\u001b[1m1006/1006\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m125s\u001b[0m 124ms/step - accuracy: 0.9689 - loss: 0.0924 - val_accuracy: 0.9863 - val_loss: 0.0411\n",
      "Epoch 4/30\n",
      "\u001b[1m1006/1006\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m130s\u001b[0m 129ms/step - accuracy: 0.9781 - loss: 0.0646 - val_accuracy: 0.9821 - val_loss: 0.0538\n",
      "Epoch 5/30\n",
      "\u001b[1m1006/1006\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m140s\u001b[0m 139ms/step - accuracy: 0.9830 - loss: 0.0508 - val_accuracy: 0.9951 - val_loss: 0.0161\n",
      "Epoch 6/30\n",
      "\u001b[1m1006/1006\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m131s\u001b[0m 130ms/step - accuracy: 0.9858 - loss: 0.0427 - val_accuracy: 0.9907 - val_loss: 0.0286\n",
      "Epoch 7/30\n",
      "\u001b[1m1006/1006\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m124s\u001b[0m 123ms/step - accuracy: 0.9880 - loss: 0.0357 - val_accuracy: 0.9830 - val_loss: 0.0506\n",
      "Epoch 8/30\n",
      "\u001b[1m1006/1006\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m120s\u001b[0m 119ms/step - accuracy: 0.9900 - loss: 0.0305 - val_accuracy: 0.9965 - val_loss: 0.0110\n",
      "Epoch 9/30\n",
      "\u001b[1m1006/1006\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m115s\u001b[0m 114ms/step - accuracy: 0.9917 - loss: 0.0261 - val_accuracy: 0.9974 - val_loss: 0.0079\n",
      "Epoch 10/30\n",
      "\u001b[1m1006/1006\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m137s\u001b[0m 136ms/step - accuracy: 0.9929 - loss: 0.0214 - val_accuracy: 0.9942 - val_loss: 0.0179\n",
      "Epoch 11/30\n",
      "\u001b[1m1006/1006\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m136s\u001b[0m 135ms/step - accuracy: 0.9939 - loss: 0.0186 - val_accuracy: 0.9966 - val_loss: 0.0090\n",
      "Epoch 12/30\n",
      "\u001b[1m1006/1006\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m122s\u001b[0m 121ms/step - accuracy: 0.9946 - loss: 0.0161 - val_accuracy: 0.9987 - val_loss: 0.0039\n",
      "Epoch 13/30\n",
      "\u001b[1m1006/1006\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m125s\u001b[0m 125ms/step - accuracy: 0.9954 - loss: 0.0143 - val_accuracy: 0.9968 - val_loss: 0.0088\n",
      "Epoch 14/30\n",
      "\u001b[1m1006/1006\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m153s\u001b[0m 153ms/step - accuracy: 0.9956 - loss: 0.0122 - val_accuracy: 0.9978 - val_loss: 0.0068\n",
      "Epoch 15/30\n",
      "\u001b[1m1006/1006\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m148s\u001b[0m 147ms/step - accuracy: 0.9962 - loss: 0.0116 - val_accuracy: 0.9958 - val_loss: 0.0131\n",
      "Epoch 16/30\n",
      "\u001b[1m1006/1006\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m147s\u001b[0m 146ms/step - accuracy: 0.9963 - loss: 0.0121 - val_accuracy: 0.9937 - val_loss: 0.0206\n",
      "Epoch 17/30\n",
      "\u001b[1m1006/1006\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m139s\u001b[0m 138ms/step - accuracy: 0.9969 - loss: 0.0088 - val_accuracy: 0.9956 - val_loss: 0.0138\n",
      "Epoch 18/30\n",
      "\u001b[1m1006/1006\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m144s\u001b[0m 143ms/step - accuracy: 0.9968 - loss: 0.0098 - val_accuracy: 0.9977 - val_loss: 0.0068\n",
      "Epoch 19/30\n",
      "\u001b[1m1006/1006\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m145s\u001b[0m 144ms/step - accuracy: 0.9974 - loss: 0.0078 - val_accuracy: 0.9987 - val_loss: 0.0037\n",
      "Epoch 20/30\n",
      "\u001b[1m1006/1006\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m166s\u001b[0m 165ms/step - accuracy: 0.9975 - loss: 0.0073 - val_accuracy: 0.9965 - val_loss: 0.0100\n",
      "Epoch 21/30\n",
      "\u001b[1m1006/1006\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m186s\u001b[0m 185ms/step - accuracy: 0.9976 - loss: 0.0070 - val_accuracy: 0.9995 - val_loss: 0.0018\n",
      "Epoch 22/30\n",
      "\u001b[1m1006/1006\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m172s\u001b[0m 171ms/step - accuracy: 0.9978 - loss: 0.0069 - val_accuracy: 0.9978 - val_loss: 0.0071\n",
      "Epoch 23/30\n",
      "\u001b[1m1006/1006\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m153s\u001b[0m 153ms/step - accuracy: 0.9981 - loss: 0.0056 - val_accuracy: 0.9957 - val_loss: 0.0126\n",
      "Epoch 24/30\n",
      "\u001b[1m1006/1006\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m147s\u001b[0m 146ms/step - accuracy: 0.9976 - loss: 0.0076 - val_accuracy: 0.9990 - val_loss: 0.0039\n",
      "Epoch 25/30\n",
      "\u001b[1m1006/1006\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m153s\u001b[0m 153ms/step - accuracy: 0.9984 - loss: 0.0050 - val_accuracy: 0.9988 - val_loss: 0.0039\n",
      "Epoch 26/30\n",
      "\u001b[1m1006/1006\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m139s\u001b[0m 138ms/step - accuracy: 0.9989 - loss: 0.0033 - val_accuracy: 0.9991 - val_loss: 0.0025\n",
      "Epoch 27/30\n",
      "\u001b[1m1006/1006\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m126s\u001b[0m 125ms/step - accuracy: 0.9985 - loss: 0.0050 - val_accuracy: 0.9993 - val_loss: 0.0023\n",
      "Epoch 28/30\n",
      "\u001b[1m1006/1006\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m144s\u001b[0m 144ms/step - accuracy: 0.9989 - loss: 0.0039 - val_accuracy: 0.9991 - val_loss: 0.0028\n",
      "Epoch 29/30\n",
      "\u001b[1m1006/1006\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m157s\u001b[0m 156ms/step - accuracy: 0.9988 - loss: 0.0039 - val_accuracy: 0.9982 - val_loss: 0.0058\n",
      "Epoch 30/30\n",
      "\u001b[1m1006/1006\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m165s\u001b[0m 164ms/step - accuracy: 0.9974 - loss: 0.0085 - val_accuracy: 0.9997 - val_loss: 0.0011\n",
      "Epoch 1/30\n",
      "\u001b[1m1006/1006\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m408s\u001b[0m 402ms/step - accuracy: 0.8624 - loss: 0.3462 - val_accuracy: 0.9876 - val_loss: 0.0411\n",
      "Epoch 2/30\n",
      "\u001b[1m1006/1006\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m336s\u001b[0m 333ms/step - accuracy: 0.9814 - loss: 0.0558 - val_accuracy: 0.9936 - val_loss: 0.0196\n",
      "Epoch 3/30\n",
      "\u001b[1m1006/1006\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 243ms/step - accuracy: 0.9893 - loss: 0.0323"
     ]
    },
    {
     "ename": "KeyboardInterrupt",
     "evalue": "",
     "output_type": "error",
     "traceback": [
      "\u001b[31m---------------------------------------------------------------------------\u001b[39m",
      "\u001b[31mKeyboardInterrupt\u001b[39m                         Traceback (most recent call last)",
      "\u001b[36mCell\u001b[39m\u001b[36m \u001b[39m\u001b[32mIn[26]\u001b[39m\u001b[32m, line 62\u001b[39m\n\u001b[32m     60\u001b[39m history1 = train_model(model1, k_x_train, k_y_train)\n\u001b[32m     61\u001b[39m history2 = train_model2(model2, k_x_train, k_y_train)\n\u001b[32m---> \u001b[39m\u001b[32m62\u001b[39m history3 = \u001b[43mtrain_model2\u001b[49m\u001b[43m(\u001b[49m\u001b[43mmodel3\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mk_x_train\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mk_y_train\u001b[49m\u001b[43m)\u001b[49m\n",
      "\u001b[36mCell\u001b[39m\u001b[36m \u001b[39m\u001b[32mIn[26]\u001b[39m\u001b[32m, line 48\u001b[39m, in \u001b[36mtrain_model2\u001b[39m\u001b[34m(model, x_train, y_train, batch_size, epochs, validation_split)\u001b[39m\n\u001b[32m     45\u001b[39m model.compile(optimizer=\u001b[33m'\u001b[39m\u001b[33madam\u001b[39m\u001b[33m'\u001b[39m, loss=\u001b[33m'\u001b[39m\u001b[33msparse_categorical_crossentropy\u001b[39m\u001b[33m'\u001b[39m, metrics=[\u001b[33m'\u001b[39m\u001b[33maccuracy\u001b[39m\u001b[33m'\u001b[39m])\n\u001b[32m     47\u001b[39m \u001b[38;5;66;03m# 训练模型，添加回调函数\u001b[39;00m\n\u001b[32m---> \u001b[39m\u001b[32m48\u001b[39m history = \u001b[43mmodel\u001b[49m\u001b[43m.\u001b[49m\u001b[43mfit\u001b[49m\u001b[43m(\u001b[49m\n\u001b[32m     49\u001b[39m \u001b[43m    \u001b[49m\u001b[43mx_train\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43my_train\u001b[49m\u001b[43m,\u001b[49m\n\u001b[32m     50\u001b[39m \u001b[43m    \u001b[49m\u001b[43mbatch_size\u001b[49m\u001b[43m=\u001b[49m\u001b[43mbatch_size\u001b[49m\u001b[43m,\u001b[49m\n\u001b[32m     51\u001b[39m \u001b[43m    \u001b[49m\u001b[43mepochs\u001b[49m\u001b[43m=\u001b[49m\u001b[43mepochs\u001b[49m\u001b[43m,\u001b[49m\n\u001b[32m     52\u001b[39m \u001b[43m    \u001b[49m\u001b[43mvalidation_split\u001b[49m\u001b[43m=\u001b[49m\u001b[43mvalidation_split\u001b[49m\u001b[43m,\u001b[49m\n\u001b[32m     53\u001b[39m \u001b[43m\u001b[49m\u001b[43m)\u001b[49m\n\u001b[32m     54\u001b[39m \u001b[38;5;28;01mreturn\u001b[39;00m history\n",
      "\u001b[36mFile \u001b[39m\u001b[32md:\\桌面\\heart-beat-prediction-master\\.venv\\Lib\\site-packages\\keras\\src\\utils\\traceback_utils.py:117\u001b[39m, in \u001b[36mfilter_traceback.<locals>.error_handler\u001b[39m\u001b[34m(*args, **kwargs)\u001b[39m\n\u001b[32m    115\u001b[39m filtered_tb = \u001b[38;5;28;01mNone\u001b[39;00m\n\u001b[32m    116\u001b[39m \u001b[38;5;28;01mtry\u001b[39;00m:\n\u001b[32m--> \u001b[39m\u001b[32m117\u001b[39m     \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[43mfn\u001b[49m\u001b[43m(\u001b[49m\u001b[43m*\u001b[49m\u001b[43margs\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43m*\u001b[49m\u001b[43m*\u001b[49m\u001b[43mkwargs\u001b[49m\u001b[43m)\u001b[49m\n\u001b[32m    118\u001b[39m \u001b[38;5;28;01mexcept\u001b[39;00m \u001b[38;5;167;01mException\u001b[39;00m \u001b[38;5;28;01mas\u001b[39;00m e:\n\u001b[32m    119\u001b[39m     filtered_tb = _process_traceback_frames(e.__traceback__)\n",
      "\u001b[36mFile \u001b[39m\u001b[32md:\\桌面\\heart-beat-prediction-master\\.venv\\Lib\\site-packages\\keras\\src\\backend\\tensorflow\\trainer.py:401\u001b[39m, in \u001b[36mTensorFlowTrainer.fit\u001b[39m\u001b[34m(self, x, y, batch_size, epochs, verbose, callbacks, validation_split, validation_data, shuffle, class_weight, sample_weight, initial_epoch, steps_per_epoch, validation_steps, validation_batch_size, validation_freq)\u001b[39m\n\u001b[32m    390\u001b[39m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;28mgetattr\u001b[39m(\u001b[38;5;28mself\u001b[39m, \u001b[33m\"\u001b[39m\u001b[33m_eval_epoch_iterator\u001b[39m\u001b[33m\"\u001b[39m, \u001b[38;5;28;01mNone\u001b[39;00m) \u001b[38;5;129;01mis\u001b[39;00m \u001b[38;5;28;01mNone\u001b[39;00m:\n\u001b[32m    391\u001b[39m     \u001b[38;5;28mself\u001b[39m._eval_epoch_iterator = TFEpochIterator(\n\u001b[32m    392\u001b[39m         x=val_x,\n\u001b[32m    393\u001b[39m         y=val_y,\n\u001b[32m   (...)\u001b[39m\u001b[32m    399\u001b[39m         shuffle=\u001b[38;5;28;01mFalse\u001b[39;00m,\n\u001b[32m    400\u001b[39m     )\n\u001b[32m--> \u001b[39m\u001b[32m401\u001b[39m val_logs = \u001b[38;5;28;43mself\u001b[39;49m\u001b[43m.\u001b[49m\u001b[43mevaluate\u001b[49m\u001b[43m(\u001b[49m\n\u001b[32m    402\u001b[39m \u001b[43m    \u001b[49m\u001b[43mx\u001b[49m\u001b[43m=\u001b[49m\u001b[43mval_x\u001b[49m\u001b[43m,\u001b[49m\n\u001b[32m    403\u001b[39m \u001b[43m    \u001b[49m\u001b[43my\u001b[49m\u001b[43m=\u001b[49m\u001b[43mval_y\u001b[49m\u001b[43m,\u001b[49m\n\u001b[32m    404\u001b[39m \u001b[43m    \u001b[49m\u001b[43msample_weight\u001b[49m\u001b[43m=\u001b[49m\u001b[43mval_sample_weight\u001b[49m\u001b[43m,\u001b[49m\n\u001b[32m    405\u001b[39m \u001b[43m    \u001b[49m\u001b[43mbatch_size\u001b[49m\u001b[43m=\u001b[49m\u001b[43mvalidation_batch_size\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;129;43;01mor\u001b[39;49;00m\u001b[43m \u001b[49m\u001b[43mbatch_size\u001b[49m\u001b[43m,\u001b[49m\n\u001b[32m    406\u001b[39m \u001b[43m    \u001b[49m\u001b[43msteps\u001b[49m\u001b[43m=\u001b[49m\u001b[43mvalidation_steps\u001b[49m\u001b[43m,\u001b[49m\n\u001b[32m    407\u001b[39m \u001b[43m    \u001b[49m\u001b[43mcallbacks\u001b[49m\u001b[43m=\u001b[49m\u001b[43mcallbacks\u001b[49m\u001b[43m,\u001b[49m\n\u001b[32m    408\u001b[39m \u001b[43m    \u001b[49m\u001b[43mreturn_dict\u001b[49m\u001b[43m=\u001b[49m\u001b[38;5;28;43;01mTrue\u001b[39;49;00m\u001b[43m,\u001b[49m\n\u001b[32m    409\u001b[39m \u001b[43m    \u001b[49m\u001b[43m_use_cached_eval_dataset\u001b[49m\u001b[43m=\u001b[49m\u001b[38;5;28;43;01mTrue\u001b[39;49;00m\u001b[43m,\u001b[49m\n\u001b[32m    410\u001b[39m \u001b[43m\u001b[49m\u001b[43m)\u001b[49m\n\u001b[32m    411\u001b[39m val_logs = {\n\u001b[32m    412\u001b[39m     \u001b[33m\"\u001b[39m\u001b[33mval_\u001b[39m\u001b[33m\"\u001b[39m + name: val \u001b[38;5;28;01mfor\u001b[39;00m name, val \u001b[38;5;129;01min\u001b[39;00m val_logs.items()\n\u001b[32m    413\u001b[39m }\n\u001b[32m    414\u001b[39m epoch_logs.update(val_logs)\n",
      "\u001b[36mFile \u001b[39m\u001b[32md:\\桌面\\heart-beat-prediction-master\\.venv\\Lib\\site-packages\\keras\\src\\utils\\traceback_utils.py:117\u001b[39m, in \u001b[36mfilter_traceback.<locals>.error_handler\u001b[39m\u001b[34m(*args, **kwargs)\u001b[39m\n\u001b[32m    115\u001b[39m filtered_tb = \u001b[38;5;28;01mNone\u001b[39;00m\n\u001b[32m    116\u001b[39m \u001b[38;5;28;01mtry\u001b[39;00m:\n\u001b[32m--> \u001b[39m\u001b[32m117\u001b[39m     \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[43mfn\u001b[49m\u001b[43m(\u001b[49m\u001b[43m*\u001b[49m\u001b[43margs\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43m*\u001b[49m\u001b[43m*\u001b[49m\u001b[43mkwargs\u001b[49m\u001b[43m)\u001b[49m\n\u001b[32m    118\u001b[39m \u001b[38;5;28;01mexcept\u001b[39;00m \u001b[38;5;167;01mException\u001b[39;00m \u001b[38;5;28;01mas\u001b[39;00m e:\n\u001b[32m    119\u001b[39m     filtered_tb = _process_traceback_frames(e.__traceback__)\n",
      "\u001b[36mFile \u001b[39m\u001b[32md:\\桌面\\heart-beat-prediction-master\\.venv\\Lib\\site-packages\\keras\\src\\backend\\tensorflow\\trainer.py:489\u001b[39m, in \u001b[36mTensorFlowTrainer.evaluate\u001b[39m\u001b[34m(self, x, y, batch_size, verbose, sample_weight, steps, callbacks, return_dict, **kwargs)\u001b[39m\n\u001b[32m    487\u001b[39m \u001b[38;5;28;01mfor\u001b[39;00m step, iterator \u001b[38;5;129;01min\u001b[39;00m epoch_iterator:\n\u001b[32m    488\u001b[39m     callbacks.on_test_batch_begin(step)\n\u001b[32m--> \u001b[39m\u001b[32m489\u001b[39m     logs = \u001b[38;5;28;43mself\u001b[39;49m\u001b[43m.\u001b[49m\u001b[43mtest_function\u001b[49m\u001b[43m(\u001b[49m\u001b[43miterator\u001b[49m\u001b[43m)\u001b[49m\n\u001b[32m    490\u001b[39m     callbacks.on_test_batch_end(step, logs)\n\u001b[32m    491\u001b[39m     \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;28mself\u001b[39m.stop_evaluating:\n",
      "\u001b[36mFile \u001b[39m\u001b[32md:\\桌面\\heart-beat-prediction-master\\.venv\\Lib\\site-packages\\keras\\src\\backend\\tensorflow\\trainer.py:220\u001b[39m, in \u001b[36mTensorFlowTrainer._make_function.<locals>.function\u001b[39m\u001b[34m(iterator)\u001b[39m\n\u001b[32m    216\u001b[39m \u001b[38;5;28;01mdef\u001b[39;00m\u001b[38;5;250m \u001b[39m\u001b[34mfunction\u001b[39m(iterator):\n\u001b[32m    217\u001b[39m     \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;28misinstance\u001b[39m(\n\u001b[32m    218\u001b[39m         iterator, (tf.data.Iterator, tf.distribute.DistributedIterator)\n\u001b[32m    219\u001b[39m     ):\n\u001b[32m--> \u001b[39m\u001b[32m220\u001b[39m         opt_outputs = \u001b[43mmulti_step_on_iterator\u001b[49m\u001b[43m(\u001b[49m\u001b[43miterator\u001b[49m\u001b[43m)\u001b[49m\n\u001b[32m    221\u001b[39m         \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m opt_outputs.has_value():\n\u001b[32m    222\u001b[39m             \u001b[38;5;28;01mraise\u001b[39;00m \u001b[38;5;167;01mStopIteration\u001b[39;00m\n",
      "\u001b[36mFile \u001b[39m\u001b[32md:\\桌面\\heart-beat-prediction-master\\.venv\\Lib\\site-packages\\tensorflow\\python\\util\\traceback_utils.py:150\u001b[39m, in \u001b[36mfilter_traceback.<locals>.error_handler\u001b[39m\u001b[34m(*args, **kwargs)\u001b[39m\n\u001b[32m    148\u001b[39m filtered_tb = \u001b[38;5;28;01mNone\u001b[39;00m\n\u001b[32m    149\u001b[39m \u001b[38;5;28;01mtry\u001b[39;00m:\n\u001b[32m--> \u001b[39m\u001b[32m150\u001b[39m   \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[43mfn\u001b[49m\u001b[43m(\u001b[49m\u001b[43m*\u001b[49m\u001b[43margs\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43m*\u001b[49m\u001b[43m*\u001b[49m\u001b[43mkwargs\u001b[49m\u001b[43m)\u001b[49m\n\u001b[32m    151\u001b[39m \u001b[38;5;28;01mexcept\u001b[39;00m \u001b[38;5;167;01mException\u001b[39;00m \u001b[38;5;28;01mas\u001b[39;00m e:\n\u001b[32m    152\u001b[39m   filtered_tb = _process_traceback_frames(e.__traceback__)\n",
      "\u001b[36mFile \u001b[39m\u001b[32md:\\桌面\\heart-beat-prediction-master\\.venv\\Lib\\site-packages\\tensorflow\\python\\eager\\polymorphic_function\\polymorphic_function.py:833\u001b[39m, in \u001b[36mFunction.__call__\u001b[39m\u001b[34m(self, *args, **kwds)\u001b[39m\n\u001b[32m    830\u001b[39m compiler = \u001b[33m\"\u001b[39m\u001b[33mxla\u001b[39m\u001b[33m\"\u001b[39m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;28mself\u001b[39m._jit_compile \u001b[38;5;28;01melse\u001b[39;00m \u001b[33m\"\u001b[39m\u001b[33mnonXla\u001b[39m\u001b[33m\"\u001b[39m\n\u001b[32m    832\u001b[39m \u001b[38;5;28;01mwith\u001b[39;00m OptionalXlaContext(\u001b[38;5;28mself\u001b[39m._jit_compile):\n\u001b[32m--> \u001b[39m\u001b[32m833\u001b[39m   result = \u001b[38;5;28;43mself\u001b[39;49m\u001b[43m.\u001b[49m\u001b[43m_call\u001b[49m\u001b[43m(\u001b[49m\u001b[43m*\u001b[49m\u001b[43margs\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43m*\u001b[49m\u001b[43m*\u001b[49m\u001b[43mkwds\u001b[49m\u001b[43m)\u001b[49m\n\u001b[32m    835\u001b[39m new_tracing_count = \u001b[38;5;28mself\u001b[39m.experimental_get_tracing_count()\n\u001b[32m    836\u001b[39m without_tracing = (tracing_count == new_tracing_count)\n",
      "\u001b[36mFile \u001b[39m\u001b[32md:\\桌面\\heart-beat-prediction-master\\.venv\\Lib\\site-packages\\tensorflow\\python\\eager\\polymorphic_function\\polymorphic_function.py:878\u001b[39m, in \u001b[36mFunction._call\u001b[39m\u001b[34m(self, *args, **kwds)\u001b[39m\n\u001b[32m    875\u001b[39m \u001b[38;5;28mself\u001b[39m._lock.release()\n\u001b[32m    876\u001b[39m \u001b[38;5;66;03m# In this case we have not created variables on the first call. So we can\u001b[39;00m\n\u001b[32m    877\u001b[39m \u001b[38;5;66;03m# run the first trace but we should fail if variables are created.\u001b[39;00m\n\u001b[32m--> \u001b[39m\u001b[32m878\u001b[39m results = \u001b[43mtracing_compilation\u001b[49m\u001b[43m.\u001b[49m\u001b[43mcall_function\u001b[49m\u001b[43m(\u001b[49m\n\u001b[32m    879\u001b[39m \u001b[43m    \u001b[49m\u001b[43margs\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mkwds\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[43m.\u001b[49m\u001b[43m_variable_creation_config\u001b[49m\n\u001b[32m    880\u001b[39m \u001b[43m\u001b[49m\u001b[43m)\u001b[49m\n\u001b[32m    881\u001b[39m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;28mself\u001b[39m._created_variables:\n\u001b[32m    882\u001b[39m   \u001b[38;5;28;01mraise\u001b[39;00m \u001b[38;5;167;01mValueError\u001b[39;00m(\u001b[33m\"\u001b[39m\u001b[33mCreating variables on a non-first call to a function\u001b[39m\u001b[33m\"\u001b[39m\n\u001b[32m    883\u001b[39m                    \u001b[33m\"\u001b[39m\u001b[33m decorated with tf.function.\u001b[39m\u001b[33m\"\u001b[39m)\n",
      "\u001b[36mFile \u001b[39m\u001b[32md:\\桌面\\heart-beat-prediction-master\\.venv\\Lib\\site-packages\\tensorflow\\python\\eager\\polymorphic_function\\tracing_compilation.py:139\u001b[39m, in \u001b[36mcall_function\u001b[39m\u001b[34m(args, kwargs, tracing_options)\u001b[39m\n\u001b[32m    137\u001b[39m bound_args = function.function_type.bind(*args, **kwargs)\n\u001b[32m    138\u001b[39m flat_inputs = function.function_type.unpack_inputs(bound_args)\n\u001b[32m--> \u001b[39m\u001b[32m139\u001b[39m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[43mfunction\u001b[49m\u001b[43m.\u001b[49m\u001b[43m_call_flat\u001b[49m\u001b[43m(\u001b[49m\u001b[43m  \u001b[49m\u001b[38;5;66;43;03m# pylint: disable=protected-access\u001b[39;49;00m\n\u001b[32m    140\u001b[39m \u001b[43m    \u001b[49m\u001b[43mflat_inputs\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mcaptured_inputs\u001b[49m\u001b[43m=\u001b[49m\u001b[43mfunction\u001b[49m\u001b[43m.\u001b[49m\u001b[43mcaptured_inputs\u001b[49m\n\u001b[32m    141\u001b[39m \u001b[43m\u001b[49m\u001b[43m)\u001b[49m\n",
      "\u001b[36mFile \u001b[39m\u001b[32md:\\桌面\\heart-beat-prediction-master\\.venv\\Lib\\site-packages\\tensorflow\\python\\eager\\polymorphic_function\\concrete_function.py:1322\u001b[39m, in \u001b[36mConcreteFunction._call_flat\u001b[39m\u001b[34m(self, tensor_inputs, captured_inputs)\u001b[39m\n\u001b[32m   1318\u001b[39m possible_gradient_type = gradients_util.PossibleTapeGradientTypes(args)\n\u001b[32m   1319\u001b[39m \u001b[38;5;28;01mif\u001b[39;00m (possible_gradient_type == gradients_util.POSSIBLE_GRADIENT_TYPES_NONE\n\u001b[32m   1320\u001b[39m     \u001b[38;5;129;01mand\u001b[39;00m executing_eagerly):\n\u001b[32m   1321\u001b[39m   \u001b[38;5;66;03m# No tape is watching; skip to running the function.\u001b[39;00m\n\u001b[32m-> \u001b[39m\u001b[32m1322\u001b[39m   \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;28;43mself\u001b[39;49m\u001b[43m.\u001b[49m\u001b[43m_inference_function\u001b[49m\u001b[43m.\u001b[49m\u001b[43mcall_preflattened\u001b[49m\u001b[43m(\u001b[49m\u001b[43margs\u001b[49m\u001b[43m)\u001b[49m\n\u001b[32m   1323\u001b[39m forward_backward = \u001b[38;5;28mself\u001b[39m._select_forward_and_backward_functions(\n\u001b[32m   1324\u001b[39m     args,\n\u001b[32m   1325\u001b[39m     possible_gradient_type,\n\u001b[32m   1326\u001b[39m     executing_eagerly)\n\u001b[32m   1327\u001b[39m forward_function, args_with_tangents = forward_backward.forward()\n",
      "\u001b[36mFile \u001b[39m\u001b[32md:\\桌面\\heart-beat-prediction-master\\.venv\\Lib\\site-packages\\tensorflow\\python\\eager\\polymorphic_function\\atomic_function.py:216\u001b[39m, in \u001b[36mAtomicFunction.call_preflattened\u001b[39m\u001b[34m(self, args)\u001b[39m\n\u001b[32m    214\u001b[39m \u001b[38;5;28;01mdef\u001b[39;00m\u001b[38;5;250m \u001b[39m\u001b[34mcall_preflattened\u001b[39m(\u001b[38;5;28mself\u001b[39m, args: Sequence[core.Tensor]) -> Any:\n\u001b[32m    215\u001b[39m \u001b[38;5;250m  \u001b[39m\u001b[33;03m\"\"\"Calls with flattened tensor inputs and returns the structured output.\"\"\"\u001b[39;00m\n\u001b[32m--> \u001b[39m\u001b[32m216\u001b[39m   flat_outputs = \u001b[38;5;28;43mself\u001b[39;49m\u001b[43m.\u001b[49m\u001b[43mcall_flat\u001b[49m\u001b[43m(\u001b[49m\u001b[43m*\u001b[49m\u001b[43margs\u001b[49m\u001b[43m)\u001b[49m\n\u001b[32m    217\u001b[39m   \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;28mself\u001b[39m.function_type.pack_output(flat_outputs)\n",
      "\u001b[36mFile \u001b[39m\u001b[32md:\\桌面\\heart-beat-prediction-master\\.venv\\Lib\\site-packages\\tensorflow\\python\\eager\\polymorphic_function\\atomic_function.py:251\u001b[39m, in \u001b[36mAtomicFunction.call_flat\u001b[39m\u001b[34m(self, *args)\u001b[39m\n\u001b[32m    249\u001b[39m \u001b[38;5;28;01mwith\u001b[39;00m record.stop_recording():\n\u001b[32m    250\u001b[39m   \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;28mself\u001b[39m._bound_context.executing_eagerly():\n\u001b[32m--> \u001b[39m\u001b[32m251\u001b[39m     outputs = \u001b[38;5;28;43mself\u001b[39;49m\u001b[43m.\u001b[49m\u001b[43m_bound_context\u001b[49m\u001b[43m.\u001b[49m\u001b[43mcall_function\u001b[49m\u001b[43m(\u001b[49m\n\u001b[32m    252\u001b[39m \u001b[43m        \u001b[49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[43m.\u001b[49m\u001b[43mname\u001b[49m\u001b[43m,\u001b[49m\n\u001b[32m    253\u001b[39m \u001b[43m        \u001b[49m\u001b[38;5;28;43mlist\u001b[39;49m\u001b[43m(\u001b[49m\u001b[43margs\u001b[49m\u001b[43m)\u001b[49m\u001b[43m,\u001b[49m\n\u001b[32m    254\u001b[39m \u001b[43m        \u001b[49m\u001b[38;5;28;43mlen\u001b[39;49m\u001b[43m(\u001b[49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[43m.\u001b[49m\u001b[43mfunction_type\u001b[49m\u001b[43m.\u001b[49m\u001b[43mflat_outputs\u001b[49m\u001b[43m)\u001b[49m\u001b[43m,\u001b[49m\n\u001b[32m    255\u001b[39m \u001b[43m    \u001b[49m\u001b[43m)\u001b[49m\n\u001b[32m    256\u001b[39m   \u001b[38;5;28;01melse\u001b[39;00m:\n\u001b[32m    257\u001b[39m     outputs = make_call_op_in_graph(\n\u001b[32m    258\u001b[39m         \u001b[38;5;28mself\u001b[39m,\n\u001b[32m    259\u001b[39m         \u001b[38;5;28mlist\u001b[39m(args),\n\u001b[32m    260\u001b[39m         \u001b[38;5;28mself\u001b[39m._bound_context.function_call_options.as_attrs(),\n\u001b[32m    261\u001b[39m     )\n",
      "\u001b[36mFile \u001b[39m\u001b[32md:\\桌面\\heart-beat-prediction-master\\.venv\\Lib\\site-packages\\tensorflow\\python\\eager\\context.py:1688\u001b[39m, in \u001b[36mContext.call_function\u001b[39m\u001b[34m(self, name, tensor_inputs, num_outputs)\u001b[39m\n\u001b[32m   1686\u001b[39m cancellation_context = cancellation.context()\n\u001b[32m   1687\u001b[39m \u001b[38;5;28;01mif\u001b[39;00m cancellation_context \u001b[38;5;129;01mis\u001b[39;00m \u001b[38;5;28;01mNone\u001b[39;00m:\n\u001b[32m-> \u001b[39m\u001b[32m1688\u001b[39m   outputs = \u001b[43mexecute\u001b[49m\u001b[43m.\u001b[49m\u001b[43mexecute\u001b[49m\u001b[43m(\u001b[49m\n\u001b[32m   1689\u001b[39m \u001b[43m      \u001b[49m\u001b[43mname\u001b[49m\u001b[43m.\u001b[49m\u001b[43mdecode\u001b[49m\u001b[43m(\u001b[49m\u001b[33;43m\"\u001b[39;49m\u001b[33;43mutf-8\u001b[39;49m\u001b[33;43m\"\u001b[39;49m\u001b[43m)\u001b[49m\u001b[43m,\u001b[49m\n\u001b[32m   1690\u001b[39m \u001b[43m      \u001b[49m\u001b[43mnum_outputs\u001b[49m\u001b[43m=\u001b[49m\u001b[43mnum_outputs\u001b[49m\u001b[43m,\u001b[49m\n\u001b[32m   1691\u001b[39m \u001b[43m      \u001b[49m\u001b[43minputs\u001b[49m\u001b[43m=\u001b[49m\u001b[43mtensor_inputs\u001b[49m\u001b[43m,\u001b[49m\n\u001b[32m   1692\u001b[39m \u001b[43m      \u001b[49m\u001b[43mattrs\u001b[49m\u001b[43m=\u001b[49m\u001b[43mattrs\u001b[49m\u001b[43m,\u001b[49m\n\u001b[32m   1693\u001b[39m \u001b[43m      \u001b[49m\u001b[43mctx\u001b[49m\u001b[43m=\u001b[49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[43m,\u001b[49m\n\u001b[32m   1694\u001b[39m \u001b[43m  \u001b[49m\u001b[43m)\u001b[49m\n\u001b[32m   1695\u001b[39m \u001b[38;5;28;01melse\u001b[39;00m:\n\u001b[32m   1696\u001b[39m   outputs = execute.execute_with_cancellation(\n\u001b[32m   1697\u001b[39m       name.decode(\u001b[33m\"\u001b[39m\u001b[33mutf-8\u001b[39m\u001b[33m\"\u001b[39m),\n\u001b[32m   1698\u001b[39m       num_outputs=num_outputs,\n\u001b[32m   (...)\u001b[39m\u001b[32m   1702\u001b[39m       cancellation_manager=cancellation_context,\n\u001b[32m   1703\u001b[39m   )\n",
      "\u001b[36mFile \u001b[39m\u001b[32md:\\桌面\\heart-beat-prediction-master\\.venv\\Lib\\site-packages\\tensorflow\\python\\eager\\execute.py:53\u001b[39m, in \u001b[36mquick_execute\u001b[39m\u001b[34m(op_name, num_outputs, inputs, attrs, ctx, name)\u001b[39m\n\u001b[32m     51\u001b[39m \u001b[38;5;28;01mtry\u001b[39;00m:\n\u001b[32m     52\u001b[39m   ctx.ensure_initialized()\n\u001b[32m---> \u001b[39m\u001b[32m53\u001b[39m   tensors = \u001b[43mpywrap_tfe\u001b[49m\u001b[43m.\u001b[49m\u001b[43mTFE_Py_Execute\u001b[49m\u001b[43m(\u001b[49m\u001b[43mctx\u001b[49m\u001b[43m.\u001b[49m\u001b[43m_handle\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mdevice_name\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mop_name\u001b[49m\u001b[43m,\u001b[49m\n\u001b[32m     54\u001b[39m \u001b[43m                                      \u001b[49m\u001b[43minputs\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mattrs\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mnum_outputs\u001b[49m\u001b[43m)\u001b[49m\n\u001b[32m     55\u001b[39m \u001b[38;5;28;01mexcept\u001b[39;00m core._NotOkStatusException \u001b[38;5;28;01mas\u001b[39;00m e:\n\u001b[32m     56\u001b[39m   \u001b[38;5;28;01mif\u001b[39;00m name \u001b[38;5;129;01mis\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m \u001b[38;5;28;01mNone\u001b[39;00m:\n",
      "\u001b[31mKeyboardInterrupt\u001b[39m: "
     ]
    }
   ],
   "source": [
    "import warnings\n",
    "warnings.filterwarnings('ignore', category=RuntimeWarning)\n",
    "from tensorflow.keras.callbacks import EarlyStopping, LearningRateScheduler\n",
    "\n",
    "# 定义学习率阶梯衰减策略\n",
    "def step_decay(epoch):\n",
    "    \"\"\"\n",
    "    学习率阶梯衰减函数\n",
    "    :param epoch: 当前 epoch\n",
    "    :return: 学习率\n",
    "    \"\"\"\n",
    "    initial_lr = 0.01  # 初始学习率\n",
    "    drop = 0.5        # 每次下降的比例\n",
    "    epochs_drop = 10  # 每隔多少个 epoch 下降一次\n",
    "    lr = initial_lr * (drop ** (epoch // epochs_drop))\n",
    "    return lr\n",
    "\n",
    "# 创建学习率调度器\n",
    "lr_scheduler = LearningRateScheduler(step_decay)\n",
    "\n",
    "# 定义模型训练函数（带学习率阶梯衰减）\n",
    "def train_model(model, x_train, y_train, batch_size=128, epochs=30, validation_split=0.5):\n",
    "    \"\"\"\n",
    "    通用模型训练函数，学习率衰减策略\n",
    "    \"\"\"\n",
    "    # 编译模型\n",
    "    model.compile(optimizer='adam', loss='sparse_categorical_crossentropy', metrics=['accuracy'])\n",
    "    \n",
    "    # 训练模型，添加回调函数\n",
    "    history = model.fit(\n",
    "        x_train, y_train,\n",
    "        batch_size=batch_size,\n",
    "        epochs=epochs,\n",
    "        validation_split=validation_split,\n",
    "        callbacks=[lr_scheduler]  # 加入学习率衰减\n",
    "    )\n",
    "    return history\n",
    "\n",
    "# 定义模型训练函数2\n",
    "def train_model2(model, x_train, y_train, batch_size=128, epochs=30, validation_split=0.5):\n",
    "    \"\"\"\n",
    "    通用模型训练函数，学习率衰减策略\n",
    "    \"\"\"\n",
    "    # 编译模型\n",
    "    model.compile(optimizer='adam', loss='sparse_categorical_crossentropy', metrics=['accuracy'])\n",
    "    \n",
    "    # 训练模型，添加回调函数\n",
    "    history = model.fit(\n",
    "        x_train, y_train,\n",
    "        batch_size=batch_size,\n",
    "        epochs=epochs,\n",
    "        validation_split=validation_split,\n",
    "    )\n",
    "    return history\n",
    "\n",
    "# 使用封装函数训练多个模型\n",
    "model1 = Net1()\n",
    "model2 = Net2()\n",
    "model3 = Net3()\n",
    "history1 = train_model(model1, k_x_train, k_y_train)\n",
    "history2 = train_model2(model2, k_x_train, k_y_train)\n",
    "history3 = train_model2(model3, k_x_train, k_y_train)\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 可视化训练过程"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 28,
   "metadata": {
    "execution": {
     "iopub.execute_input": "2025-01-01T03:33:53.629791Z",
     "iopub.status.busy": "2025-01-01T03:33:53.629470Z",
     "iopub.status.idle": "2025-01-01T03:33:54.846439Z",
     "shell.execute_reply": "2025-01-01T03:33:54.845576Z",
     "shell.execute_reply.started": "2025-01-01T03:33:53.629759Z"
    },
    "trusted": true
   },
   "outputs": [
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAA/QAAAHWCAYAAADZ3sJ2AAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjEwLjMsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvZiW1igAAAAlwSFlzAAAPYQAAD2EBqD+naQAAwUtJREFUeJzs3Qd4U2UXB/B/k+69KXvvvQVkKAgCKsgQcYCIOPkcqCgOQBwoKiKKoCBuBJXhRpkKspQlsnfZHdC9k3zPeW8TWmhLW7L7/z3PtcnNzc1NWrk595z3vB4mk8kEIiIiIiIiInIpOkcfABERERERERGVHQN6IiIiIiIiIhfEgJ6IiIiIiIjIBTGgJyIiIiIiInJBDOiJiIiIiIiIXBADeiIiIiIiIiIXxICeiIiIiIiIyAUxoCciIiIiIiJyQQzoiYiIiIiIiFwQA3oiFzR58mR4eHiU67mffvqpeu6xY8fgCuRY5f0SERE5O56ficjeGNCTUzOf3Hx9fXHq1KnLHu/RoweaNWtWrn0vWLAAM2bMKPKx2bNnY+jQoahRo4Z6/XvuuadU+6xVq5ba/kqLvK+K/EUnISGh2M/vpptuuurXKel360qs9XkQEVkbz8/uhefn8jEYDKhSpYr67H799VdHHw5VUJ6OPgCi0sjOzsbrr7+O9957z2r7lJPKf//9h8cff/yyx9544w2kpqaiQ4cOOHPmTKn3KSeptLQ0y/1ffvkFX3/9Nd555x1ERkZa1nfu3Pmqjv2FF17As88+W67n3n333bj99tvh4+MDV5CZmQlPT0+r/W6JiMh6eH4ujOfninV+Xr16tfo7lAseX331Ffr27evoQ6IKiAE9uYRWrVph7ty5mDBhgroSamt//PGH5ep/YGBgqZ83cODAQvfPnj2rvjDIevnHvjjp6ekICAgo9evICbSsJ1EzvV6vFlch2R9nkJeXB6PRCG9vb0cfChGR0+D5uTCenyvW+fnLL79EmzZtMHLkSDz33HNl/nuxF36HcW8suSeXIP9ISlmTZAFK+w9s27Zt4efnh/DwcHXF+8SJE4VKAX/++WccP37cUmZX8IRes2bNco+BuxIpD5QvIYcPH0a/fv0QFBSEO++8Uz22bt06SymhXKGvXr06nnjiCXUV/Epj9OT+2LFjsWzZMlXmKM9v2rQpli9ffsUxeuZSuvXr16ush5yk69Spg88///yy4//333/RvXt39dlWq1YNr7zyCj755BObjfu7dIyeZGbkyr4cs7zH6Oho3HDDDdi2bVupfrdxcXEYPXo0KlWqpN5ny5Yt8dlnnxV6TXkf8ry33npLZXXq1q2rXmvLli3qRP3YY49ddpwnT55UX8SmTp0Ke5+kX375ZcsxynuV/18ka1bQP//8gz59+qhMlPzuateujXvvvbfQNgsXLlT/38jfZHBwMJo3b453333Xru+HiFwLz888P1fU87P87pcuXar+hm+77TZ1//vvvy9yWynHl9+N+fzavn17Va1Q0ObNm9XfXVhYmHovLVq0KHQOls9PlqL+bgt+jsV9Rnv27EFOTg4mTpyo/h8MCQlRr9O1a1esWbPmsv3KBQB5ffkuIL+PqKgo3Hjjjer7hJD3I7+jojRs2FB95yD7YIaeXIIEHyNGjFBZACllKykL8Oqrr+LFF19U/7jed999iI+PV6WA3bp1w/bt2xEaGornn38eycnJ6h95KbcTZbnSb40gTP6hu/baa9U/uP7+/mr9t99+i4yMDDz00EOIiIhQJyg5djlOeexK5IS/ZMkSPPzww+qkMXPmTAwePBixsbFqfyU5dOgQhgwZok6mcqV5/vz56iQh/+jLFw8h4ySvu+46daKQbIycCObNm1fm8sDz588XuV5OHlfy4IMP4rvvvlNfjpo0aYLExET1vvfu3auukpf0u5WTrZwM5b3K8+XvSj5XeZ9JSUmXfRGQL0JZWVm4//771XuUL3K33norFi1ahOnTpxfKpEimx2QyWb782Yv8jcsXHvndPfnkk+oLgXxpkc9DvmiYvyT17t1bnYzl/x/5f0BO+PK3YrZixQoMHz4cPXv2VCWtQvbx119/FfkFiYhI8PzM83NFPT//8MMPahiHBPQxMTHq+KXs/o477rjsQo1cQJfflfxu5O9c/t7lgo55WzkHy4WbypUrq/cq+5PP7aeffir3OfjSz0guoKWkpKi/CznfjxkzRl2E+fjjj9XfvPxNS8WNmfy9ybHLMAL5/1X+35ALW5s2bUK7du3UEBHZhwyhKNgv4++//8aBAwfU8BOyExORE/vkk09M8mf6999/mw4fPmzy9PQ0Pfroo5bHu3fvbmratKnl/rFjx0x6vd706quvFtrPrl271HMLru/fv7+pZs2aVzyGgIAA08iRI8t1/G+++aY6/qNHj1rWyb5k3bPPPnvZ9hkZGZetmzp1qsnDw8N0/Phxy7pJkyapfRQk9729vU2HDh2yrNu5c6da/9577132mRY8JvkcZN2ff/5pWRcXF2fy8fExPfnkk5Z1//vf/9SxbN++3bIuMTHRFB4eftk+i2I+7pIW+b1c+r7keWYhISGmRx55pMTXKe53O2PGDLW/L7/80rIuJyfH1KlTJ1NgYKApJSVFrZP3IdsFBwerz6Gg3377TT3266+/FlrfokUL9fdoTfIeLv08CtqxY4c6lvvuu6/Q+qeeekqtX716tbq/dOlSy/9HxXnsscfU+83Ly7PiOyAid8XzM8/PFfn8LG666SZTly5dLPc/+ugj9bdc8LiSkpJMQUFBpo4dO5oyMzMLPd9oNKqfct6tXbu2+lwuXLhQ5DZC3kNR70P+bgt+piV9RvJa2dnZhdbJa1aqVMl07733WtbJ9wfZR8H/py89Jnlvvr6+pmeeeabQ4/Ic+X8zLS2tiE+NbIEl9+QypMRMrgZ+9NFHxTbCkavfchVZrv5Lp1bzIlc669evX2RJkaPIVf5LSZmcmYzDkmOXBj1y3pSruVfSq1cvVVplJuVaUtp15MiRKz5XrqZL2ZWZZHOlZKrgc+VqcqdOnQpdwZUrvmW96r148WJ1NfrSRcrsrkSubEsW+vTp0ygraYIkfwtyZdrMy8sLjz76qLrKLmMzC5LsiXwOl37GkoGSq/BmcnVaSh3vuusu2JO8HzFu3LhC6yVTL6S00fyZCbnSn5ubW+S+ZBv5m5PfAxFRWfD8zPNzRTs/S/XBb7/9Vuh45ZikQuKbb76xrJPPTrLgUr1yac8B89AM+fs5evSoGq5gPl9fuk15FPUZSeWCeRy9/P8oFRmSeZeMu3lohPnvQF570qRJl+3XfExSsj9gwABLBYSQ4TdSJSG9KZyxl4C7YkBPLkXKd+QfnuLG6h08eFD9oyJfDuQfsYKLlC5J6bEzkIY5Mr7tUlJ6J+VlchKWMjQ5bhmjJKRM7Uqk5OxSMhbrwoULVnmujHurV6/eZdsVta4kUl4pJ95Ll9I02Jk2bZo6Qcv4RRlPKOP3SvOFyHz88reh0xX+p69x48aWxwuSkr9LyXPlC5KMhZTySyFfHuTYZXxlSaS8VBoxmZeCHZfLQ45XjufSz1++FMmXAvP7kb8hObG/9NJLagy9nIClFK/gOHspA23QoIEqrZO/TSkPvHR8JxFRcXh+LhnPz+51fpagVS6Qt27dWg0TkEWC444dOxa6oCD9GERJUziWZpvyKOozEjJMTy4oyeciwz3kb1kSAAX/juWY5OKI/L2XRIbbyP8bUoovVq5ciXPnzqkLfGQ/DOjJ5bIAcpW1uCyAXG2UK4cSiBR1hfnDDz+EM5CxTJeetOSqpjSPkX9Un3nmGXVCkmM2z4lbmvFrxXXHNV85tdVz7UmyO/IFQcYuysnmzTffVOPSbDH/a8GMzKUnMDnZy+9IPh9pbCNj3+RqdUmkCY6MjzMvMj7TGq50BV8el3GNGzduVGMTZaylBOwy/tL8pUWaF+3YsUONCbzllltUtkyCexmvSUR0JTw/l4znZ/c6P5uD9i5duqgLEeZFegbIuba0FzKsca6Xv8/SfkbSlFIuTEm1iIydN///eP3115fq7/hSMvZeqjdkv+b9S1JBLgKR/bApHrlkFkD+wTA37ipI/oGSf8DlqqRkG0tiqy655bVr1y7VRESunMoJycyZSqClu7Bchb5UUetsSU62klGWRbI60mxHmi2Z538t7ncrxy+ld3LSKviFbd++fZbHS0OuostVeTmhSyZHrk6XZg5m2b5gR2T5Anw15HjlvUjmy5zFEHJ1XJoIXfp+rrnmGrXIZyVfciSTIZ3tpdmNkDK8m2++WS2yX/l85Uu2NLEqa5aHiCoenp8dh+dn+52fpTx+w4YN6gK5uUrDTI5fstNyjpX/H8zDLKRyobjzaMFtSgqEpSqjqAsFl1YvlEQu7st7kyEwBX8Xl5bWyzHJkAKpOigpSy8Xm6Sxn1zckv/v5UKKNMpzpekX3QEz9ORy5B8ZyQJIoCFlUQUNGjRI/SMipcWXXrmW+zLmyUzG9pSmTM5ezP/4FTxuue1M04bJlVi58iyZXDP5x75geZktyVXoS39nklmWTEDB8vHifrcyHYz8zUipnJmUiMrJXkooLz0xl0RO2L///ruaEkZK1sxfVkoiV/ILljBebUAv70fIMRQkHX5F//791U8py7z0/wfzOEvz51bw/w0hX6ikJK/gNkREJeH52XF4frbf+dn8mY4fP17NPlBwkSoFOVbzNjLDjMxqILPPSMf5gsx/T3LRQy50yfHKxfiitjH//yUXOGR4gNnOnTvVbDRX87csfQ/kb6cgGaYn28j/r5e69P9f+bzle8YDDzygqiPs3U+ImKEnFyVTn3zxxRfYv3+/ZcoW8z92Mu+qTAsi03JJUw75h1SupsoUXjJ1x1NPPaW2lXJjOXFIQzEptZIThmQmxY8//qj+kRQyRkquGst+hZQjmwMda2rUqJE6fjk+KYmWZjnSlKQ04+vsRU5ekn2R0sP//e9/lmlxZHyffHGwdVZFGsvIFXc5acrcp/I7k/FaMkXK22+/bdmuuN+t/P7li6aUm23dulXN2ypXq+VkKCdS+VspLbkiLZ+H/F1JAyVp3mMLkl0x/+0VJBkICdilJF5KXOVLgHyJkGlnJIskf/syhZGQ+x988IGa0kf+xuRzlCmm5G/MfFFAsvTyO5SyO/mM5Yq/fJGSwL9g9p+IqCQ8PzsGz8/2Oz9LsC7nRukVUBT5O5TfgTSZk2BdpuiTc6y8Xzk2ybTL37CM85fzs1xAnz17tvocZL+jRo1SlQ4SvO/evVtlyoUMlZML9nLxRqaUkwqIOXPmqP/PZDq60pDhB5Kdl+8D8h1C/v+TfUjjxYJ9A+T7gwTqMr2iVAHK/PNSfSBj5eUxqU4o+H1EKiNkmkH5viDvmezMJr3ziWwwLc6lzNPLFJwWx2zx4sWma6+9Vk2bIUujRo3UVCr79++3bCPTadxxxx2m0NBQtZ+CU36Y913UIsd0tdPiyDEVZc+ePaZevXqpKVoiIyNNY8aMsUxtU/B1i5sWp6jpYuR9FZzWp7hpcYqaHq2oKVJkSpyuXbuqKXOqVaumpu2ZOXOm2ufZs2dL/DzMxx0fH1/k40UdR8FpcWSqlaefftrUsmVLNQ2MfI5y+4MPPij0nJJ+t+fOnTONGjVKfb4yjVDz5s0v+52ap3yR319J+vXrp7bbsGGDyRbM0xUVtYwePVptk5uba3rppZfUlDdeXl6m6tWrmyZMmGDKysqy7Gfbtm2m4cOHm2rUqKF+b9HR0Wq6nX/++ceyzXfffWfq3bu3ekw+F9n2gQceMJ05c8Ym742IXBvPzzw/V8Tz89atW9V+X3zxxWK3kSkaZZsnnnjCsu6HH34wde7c2eTn56emk+vQoYPp66+/LvS89evXm2644QbL5yfT7RWc1lDItH516tRRn0+rVq3UVH3FTVtX1GckU8699tpranv5O2ndurXpp59+umwf5inuZB/y/6i8XlRUlKlv377qM7jUtGnT1GvKvsn+POQ/9r6IQETuRaZakSvrcnW3Io2bkivcMrbS3mMUiYiISoPnZ56f7UGGnzzxxBOq+qaoWRnItjiGnojKpGDTGCHjHqW88tprr61QXxaki7N0PObULERE5Ax4ftbw/GxfkhuWjvky7I/BvGNwDD0RlUmnTp3Qo0cPNU5KuqnLP+Iydks6oVcEMt5MxvTJ2EQZlydNYIiIiByN52een+0pPT1dTXUr09xKNcT333/v6EOqsBjQE1GZSBM1aVQjjdikyY40P5EvDd26dUNF8Mcff6iGNXIVWprZyHyrREREjsbzM8/P9iTd9qXJX2hoKJ577jnVDJAcg2PoiYiIiIiIiFwQx9ATERERERERuSAG9EREREREREQuiGPoi2A0GnH69GkEBQWpMUhERESOJiPkUlNTUaVKFeh0vB5/tXiuJyIidzjXM6Avgpzgq1ev7ujDICIiusyJEydQrVo1Rx+Gy+O5noiI3OFcz4C+CHK13vxBBgcHO/pwiIiI1PRTEoCaz1F0dXiuJyIidzjXM6Avgrn0Tk7wPMkTEZEzYXm4dfBcT0RE7nCu5yA8IiIiIiIiIhfEgJ6IiIiIiIjIBTGgJyIiIiIiInJBHENPRFTG6UTy8vJgMBgcfSjkZvR6PTw9PTlGnoiIiEqNAT0RUSnl5OTgzJkzyMjIcPShkJvy9/dH5cqV4e3t7ehDISIiIhfAgJ6IqBSMRiOOHj2qsqhVqlRRARczqWTNyg+5YBQfH6/+zurXrw+djqPiiIiIqGQM6ImISkGCLQnqZW5QyaISWZufnx+8vLxw/Phx9ffm6+vr6EMiIiIiJ8fL/0REZcCsKdmSO/59/fnnn7j55ptVZYtUtSxbtuyKz1m7di3atGkDHx8f1KtXD59++ull28yaNQu1atVSFz46duyILVu22OgdEBEROS/3++ZARERETiM9PR0tW7ZUAXhpyJCD/v3747rrrsOOHTvw+OOP47777sNvv/1m2WbRokUYN24cJk2ahG3btqn99+nTB3FxcTZ8J0RERM6HJfdERERkM3379lVLac2ZMwe1a9fG22+/re43btwY69evxzvvvKOCdjF9+nSMGTMGo0aNsjzn559/xvz58/Hss8/a6J0QERE5H2boiYiozKTUecaMGY4+DHJDGzduRK9evQqtk0Be1gvpL7B169ZC28hQBblv3qYo2dnZSElJKbQQERG5Ogb0RERuTMYsl7RMnjy5XPv9+++/cf/991/VsfXo0UOVUxMVdPbsWVSqVKnQOrkvAXhmZiYSEhJgMBiK3EaeW5ypU6ciJCTEskiDSyIiIlfHknsiIjd25syZQuOOJ06ciP3791vWBQYGFpo6TQIlT88rnxqioqJscLREtjNhwgQ17t5MLhAwqCciIlfHDL2NjV2wDT3fXovtsRccfShEZGUSAGfk5DlkkdcujZiYGMsiWUnJypvv79u3D0FBQfj111/Rtm1b1VFcxiofPnwYAwYMUBlPCfjbt2+PlStXllhyL/udN28ebr31VjWtn8yj/sMPP1zV57t48WI0bdpUHZe8nnlMtdkHH3ygXke6nMuxDhkyxPLYd999h+bNm6up4CIiIlQ5tjRnI+cnf5vnzp0rtE7uBwcHq99nZGQk9Hp9kdvIc4sjf0eyj4ILEZGzyco14HhiOjYdScT3O07hl11n1O1Dcam4kC5T6Jbu/G9r8j0k12As9feRssjJMyI5IxdnkjNxOD4N/51Kxu7Tyep+dp4BtpSdZ0BCWjaOxKdh54kkrD+YoH4Hi/6Oxbx1RzB9xQFM/mE3nvxmJ+7//B/c/tFG9J+5DqM//RuOwgy9jZ24IH+I6UhMy3H0oRCRlWXmGtBk4sXO2/a0Z0of+Htb559waSL21ltvoU6dOggLC8OJEyfQr18/vPrqqyoI+vzzz9W0Y5LZr1GjRrH7eemllzBt2jS8+eabeO+993DnnXeqOdXDw8PLfEwyRvq2225TQwKGDRuGDRs24OGHH1bB+T333IN//vkHjz76KL744gt07twZ58+fx7p16yxVCcOHD1fHIhcYUlNT1WO2+NJB1tepUyf88ssvhdatWLFCrRfe3t7qAtSqVaswcOBAtc5oNKr7Y8eOdcgxExGVKOkEsOtb5GSmID0rBxmZ2UjPzkFmVjYys3OQlZ2LrJwcZOfmIi8vD3oYoIcRnjAiB544YvLBbvgiE97Igi88vP2h9wmAl18AvH0D4esfCL+AIAQEhSAoMAg+vgHI89AjDzrkmTwhe1T3TZ4wmACD0QSDyaQuDph/5hhMyMzJQ3qOAZk5BqRnSwLBoJIIsk5LKBiQkW1Aek6e2iYv/+KCt14Hb09t8bnkpzzm46kvtE4uBMi+ZB/qZ655/3kIzElELZxCHY8zqOtx2vIzxCNdvZ8U6GCEHiadJ+ChB3SyeEKn94SH3hN6vSd0nl7wlJ96PfKM2vuVY80zGNVP832D0Yg8Q/5j+fflu4L2Ckb1MxRGROTfNq/zhAE6D5O6ry0GnLsgF5T/ccifFwN6Gwv21T7ilKxcRx8KEVGRpkyZghtuuMFyXwJwmQbM7OWXX8bSpUtVxr2kgEkCbQmkxWuvvYaZM2equcFvvPHGMh+TdDHv2bMnXnzxRXW/QYMG2LNnj7pYIK8TGxuLgIAA3HTTTarKoGbNmmjdurUloJcvRIMGDVLrhWTryTHS0tJw6NChQtPSyXR08ncmF4ikFP7UqVPqwpF48MEH8f7772P8+PG49957sXr1anzzzTeqi72ZlM6PHDkS7dq1Q4cOHVS1iFRgmLveExE5hcwLwLrpMGyaA70xB94S/AIIK+k5+lLs1yj7zl/KyGDyQB48kStBfoEl0+SNk6YonDBFI9YUjbj8n7Kk4OLwvKLkGIxqQXbpjsEbuajpcS4/YD+NurrTluA92LuUb8qUvxhhPR75SzkEBpY9eWEtDOhtLNjXS/1MyWRAT+Ru/Lz0KlPuqNe2FgmKLg3AJDMuAZQ5OJZmZBJEl6RFixaW2xJsS0lzeecF37t3ryr7L6hLly4qcJNx/nIBQoJ1qSqQCwaymMv95WKEXAyQIF66o/fu3VuV40v1AdmfVFPInPJm5nHsEpB/+umn6m+s4N+WTFknf3tPPPEE3n33XVSrVk0N5zBPWSekaiM+Pl71hJBGeK1atcLy5csva5RHRMVIiwd8QwBPCS/J6nKzgC0fwbTubXhkJakYfbOxEfYYa6pMsq+PN/x9vOHn440APx8E+Hoj0M8HgX6+CPLzga+3FzwkAy3ZZ0MOkJMB5KbDkJ2BnMxUZGemIy8rDcacDJhy0uGRmwFdXhY8DZnwMmbBy5RjyfJfSq8yy7nwwSWxiQdQG+eKfjteQcgKrI7coBowhNYEwmpBH14bnuHVYcjNhiEjGXmZyTBlJsOYlQJTVgqQnQIPtaRCn5MCXW4aPHNT4ZWbCv+sOJXpLorJQwdjaE14RNaHLrIBoJb6QEA0TMY8pGXmICUjUy2pGdlIzchCamYW0jOzkCaVD1L1oCogstX3F/m+5O8tiyf8vC/e9i/mtmwjn79k+i9WAOgv3i70U6eqA+S2j6cPHIUBvY0F+2kfcWpWnqMPhYisTMaNW6vs3ZEk+C7oqaeeUiXOUoZfr149NW5ZAmKZLqwkXl7aBcyCn4+UQtuCZOW3bduGtWvX4vfff1eBnVyEkO77oaGh6vilTF8ek/L/559/Hps3b1bBItmXzGZQ0nAHCeqLes727dtL3K9Ui7DEnqiMjAbgzzeBta8DVdsCo34BHBiIuOXn++83wJpXgeQTKtm7z1gdr+fdjhY9hmJMtzoIyk/2lYdcGPDLX0p3PEbAmAcYcwFDrnbb/FOty/8p97NTgQvHgaTjwIVjF5e0cyoI97qwB5Cl5Gv7pecTrAXqErBH1MsP3BvAI7w29MX8TcrnGZS/VLXSYbgD1/8m6ioZepbcE5GL+Ouvv1RZu2S8zRn7Y8eO2fUYGjdurI7j0uOS0ntpiCakG780u5Nl0qRJKpCX8mwptZeLCZLRl0WCfcnmy7CBgl3OiYgqlPREYMl9wOHV2v1T/wCrXwZ6vwK3IBcOPTwc99qHVgErJwHn/lOr4jwi8WbOIPys64Fpt7fGTS2q2P+4VAbZXOhfCrWuvXxdTjqQFKsF+wUDfVlSTmsXhHyDtQBd/QwCfEKKWGe+HQKEVAMCox33+3IzDOhtLNjPXHLPDD0RuQbpHL9kyRLVCE8CYxnHbqtMu5RNy3jqgipXrownn3xSddeX8ftSXr1x40Y1rlo624uffvoJR44cQbdu3VQpvTRRk2Ns2LChysRLgzQptY+Ojlb35XXkIgERUYV04m/g25FAyinA0w9oMwLY8iGw4T2g7vXa4qqkvHvzHGDTbCC6MXDj60Dli0PAbO70dmDFRODon+punlcQ3s+7BbMzb0BYcDAWjWiH5tVC4LK8A7TPVRZySgzobSyITfGIyMVIQzppRibd42WKsGeeeUbN2W0LCxYsUEtBEsS/8MILqhGaZNflvgT50rxPKgeEZOPlooOU2WdlZamLEF9//bWa5k7G3//5559qvL0ct2TnZcq7vn372uQ9EBE5Lckcb/4Q+P15raxaSptv+xyo1FS7/8/HwNIHgYc2AAGRcCmSOd4yF/hrhtZ8Thz/C/ioO9DuXuC65wF/GzYqO39Uq3D4b7F2X++NPdVvx4gD1yLBGIiW1UMx9+62iA72td0xEMlQBBPn8bmMfAGU+ZqTk5Ovep7aZdtP4fFFO3BtvUh8eV9Hqx0jEdmXBI3SnVvGYMu850T2/juz5rmJ+HlSBSBjon/4H7B7qXa/yUDglve0smchjdbmXgfE7wMa3AgMX+gaJdDScO6f+cD66UB6vLZOLlRc+4RW9r57ibbOLxzoNQlofbfWxMxaUs8B698B/p6njT+HB4zNh2KG4TbM3Kb1mhnYqgpeH9wCvlZsYEsVQ0o5zk3M0NupKR4z9ERERERUJMmv7f8VOLMTqNMDqN5RG/9cXuf2AN+MABIPal24e78KdHygcMDu7Q8M/hiYez1wYLkWoHYYA6tKPgXEbgSqtAbC61zdBYO8HGD758CfbwGpZ7R1YbWA7s8AzW8DpCt567uAdqOAX8YD8XuBHx8Dtn4K9HsLqFZ4RpcykeZxh1YC2z7XPiuTQVtf93qkXvsCHlyVi78OJapVT/dpiId71FVD1ojsgQG9jZk7WXLaOiIiIiK6zLG/tGZqJ//W7v/xOhBcFWh6K9BsEFClTdkC4Z0LgR8fB/Iytf0M/RSo3qHobWOaATdMAZY/A/z2PFCzC1CpiXXel1xU+HwAkJ4/fWlgJaBGJ+01anYCopuW7qKFdGXf+TXwx5tAcn6L9eBqQPengVZ3AvpLusbX7gY8uE67QLHmNW2M+7yeQKu7gF6TgcCo0r+H80eA7V8COxZcvIgg5IJLj2dxKKgD7vvsbxxLzFDTns0Y1gq9m8aUfv9EVsCA3k5d7jltHRERERFZnP0PWPUScPB37b6XP1DnOuDYOq153cb3tUWy0M0GA00HaWPfiwvupRR9+bPA1k+0+9LobtA8ICCi5OOQzL1knw+tABaPBsasBrxKPTFa0SSI/uJWbWx7QBSQlaymP8OeZdoipNt5jWu04L5GZy2L7+ldeAq4Xd9qU+xdOKqtC4wBuj2lNfUrabo9CfKveUj73FZOBnZ8Bez4Etj7I3Ddc0D7+2DS6VUgnpaVh6ggH0QGesNTrwNyM7XtJBsvvwsz/wig5XCthD+6Edbuj8P/PvhLfcevGuqHeSPboXFlDt8h+2NAb8eSe2lXwPIbIiIiogpMpv+SzPG/i6TWXiuJbzMS6D4eCIrRAvPDq7Rma1KGL9ODrXtbWyIbakGqLJH1CuzzmFZiLyX7Mlt3j2eBbk+Xbuy4fDcdOBuY3QmI2wOsmAT0m1b+9xe7CfhqKJCdAlRtB9z1ndZZ/9RWIHYDcHwjTCc2wyM7GTj4m7ZI/K73RXpUKyRHtUemXyXUPPgZvC8c1PbpH6mNkW8/umwXG2RqtIEfAG3vQd5PT8Lz3L+qGuHEqtmYmHsP1mQ1sGzaVHcMI33+RF+sQ5ApXa0zwQOnIjojrt5QmBr0RVRoMKKDffDV+qN49ec9MJqA9rXCMPuutogMLOECA5ENsSmejRvlpGXnodkk7R+qvVNuhJ83m2MQuSI2xSN7YFM8++HnSQ6ZB37dW1opuEFrnqbK6q9/EYioW3wndxmz/d8S4OAKwJB98bGYFlpJflAV4NentSy4NIIbPA+o17Psx3dwJfDVYO32Hd8ADfqU6ek5eUYk/LsclX6+F3pDJo4GtMKUoEk4nqZDVq4BWXlGZOf/lA77jT2Oo4NuPzro9qG9bh8iPFIv2+cFUyAWeg3E39FDEBMViVoR/qgZEYBaEQGoEe5f7PfqzBwD/judjJ0nkrD9RJL6efpCOm7Xr8HTnosQ5pGmtvvJ2Bl7PRujb95qNNPlVwEAOGmKxDd5PfCdoRtOo/ju/0PbVsMrtzaDjye/35Pjzk0M6G18kpePt+5zv6greJuf64lKnLqCyCUxoCd7YEBvP/w8yW4kKN/4AbBhppa1lu+HtbvhQufnsV9XH4fj09RyKC5NlW83qxqMtjXD0LZGOKqH+12s7pSAfd8vWub+yBpt2rmCqrXXxsuHVCv/sS6fAGz6QCsvl6nspGKgAIPRhNNJmTiakF5oOZaYjvpJ6zDLcyZ8PHKx1tASD+Y+jixcOWvt7amDr6cHGnieRQePfWiNvahuPIWVuS0xJ+dGpMG/2OdWCvbJD/D9UT3MH2dSsrAjNgn7z6WqYy1IPsZ6UYHoVNkDd2Z8gQYnvoWHVEjkM+m9kVKzD47VGIT9AW0Rn5aLuJQsxKdlIy4lG3GpsmQhK9cIL70HnrmxEUZfW5vVt2RV7HLvhOR/8mA/LyRl5CI1K5cBPREREVFFYMiFYetnMK19A54ZWmO4k771Mc9nJJYcrY+UvdIVXeuMXtCOE0n4cpPW/E3GdbepEaYC/DY1w9C86W3wbTVcy/bv/UEL7qXEvf19WnO7gmPQi0gyXcjIxZnkTJxNzlLDQTNyDCqbnZG/5GQNxX2+v6NKxiH8N+sOvBL6MjLyTJbt4lOzkWMwXrbv/rpNmOE1C14eBvzl1QlL603GmOgwlUmvFuYHf29P+HhJ4K4v9NNbr4NOV3RA3NBkwu3pOTiemI5jCRnaz0Ttp1xESMnKw7mUbLVsOXr+sudHB/mgVfVQNR986+qhaFYtxNLbCugGnH5Em0dexvk3HwqPFsMQ4h+OloBaivsMU7PzoPPwQKAPwyhyDvxLtAP5x0MC+uRMNsYjIiIicndLFn2CDvunoZrxtLp/3BiNt/Juw09Z18AE6exugMSx1cP9UTcqEHWjAtRPfx9PVR6+LfYC/juVjIS0HPy+55xahGSGm1QJQVsV5N+INrfejsrBvirPLN81T8clq2D9dHIWziZn4kxSFs4ky5KpfmZLufsV/OlxP370fgHNsrai6Ymv8LGhf6HHJQivEeGP2pEBark+awU67nofHiYjTM1vQ5eBs9FFppCzQlJMxqXL0rZm+GWPJ2XkWAJ8Cfhjz2eoCyASxLeqEYqYYN+Ss+dVWgF3LS7zMV28KEDkHBjQ20GQL+eiJyIiIqoIDuzdiZv2PAlvDwPiTcGYYxqMrZG3oGZ0GJ5QwXsg6kZr48B9vS4fe31Lyyrqp4w7l6Begvutx2VJQkJatgr4ZZn/lzbmW4JY6dkkpeClIdvHhPgi1M9bjUH3tyye6qefd0NsP5eCzntfwfPe36D3DUNhqNQcAd6eCA/wRpVQP+jNWfUtc4FfXtRutxkJj5veKV0jPisI9fdGK1mqh9rl9YicFQN6O+DUdUTk6nr06IFWrVphxowZ6n6tWrXw+OOPq6WkTMbSpUsxcODAq3pta+2HiMgeUpa/rIL5fb6tEHzvd3g+MrLYsvKSSLDfrla4Wszl3icvZKrg3hzk7zubqrL4lwbrlUP8ULnQT+12pRCf0jVwMz0FLNoB3b6f0HHr08ADfwDeAYW3WT8DWDlJu93xIeDGqcVPqUdENsOA3p5T12UyQ09E9nXzzTcjNzcXy5cvv+yxdevWoVu3bti5cydatGhRpv3+/fffCAi45MvdVZo8eTKWLVuGHTt2FFp/5swZhIWFwZY+/fRTdXEiKSnJpq9DRO7t/NEdaJO0Us0cp+vzCqpER1lt33JxU0r0ZRnYuqpal56dp5rphfp7qT5NRWX8y/liwC3vaVPNJR7UmuXdMlN7TPppy7R7f+ZPbdf1KeD6FxjMEzmIDOIhGwvKz9Cz5J6I7G306NFYsWIFTp48edljn3zyCdq1a1fmYF5ERUXB37/4zsPWFBMTAx8fzu9LRM7vwo8TofMwYYPPtWjQuqvNXy/Ax1M1fZNO71YL5s38w4Fb52jz2m/7DNjzvRbM//7CxWC+5ySg54sM5okciAG9HbDknshNyRcbmY7IEUspZxy96aabVPAtGeiC0tLS8O2336qAPzExEcOHD0fVqlVVkN68eXN8/fXXJe5XSu7N5ffi4MGDKtsvU601adJEXUS41DPPPIMGDRqo16hTpw5efPFFVT0g5PheeuklVS0gWShZzMcstyVzb7Zr1y5cf/318PPzQ0REBO6//371fszuueceVZ7/1ltvoXLlymqbRx55xPJa5REbG4sBAwYgMDBQTSNz22234dw5rUmVkOO+7rrrEBQUpB5v27Yt/vnnH/XY8ePHVaWEVBlIVUPTpk3xyy+/lPtYiMg55RzfjLrn/4DB5IHsrhPgFur0ALo8pt3+4VFg6YPAxve1+32nAV3HOfTwiIgl93bBknsiN5WbAbymNS+yu+dOXz6esQienp4YMWKECo6ff/55S8dfCeYNBoMK5CUYlgBUAm4JRn/++WfcfffdqFu3Ljp06HDF1zAajRg0aBAqVaqEzZs3q7lTixpbL8GuHEeVKlVUUD5mzBi1bvz48Rg2bBj+++8/NTRg5cqVanuZh/VS6enp6NOnDzp16qTK/uPi4nDfffdh7NixhS5arFmzRgXz8vPQoUNq/9IDQF6zrOT9mYP5P/74A3l5eeoCgexz7dq1aps777wTrVu3xuzZs6HX69WwAS8v7WKubJuTk4M///xTBfR79uxR+yIi95L040REA/hFfx1u7NQZbuO654GjfwCntwP/LtQy9lKO3+ZuRx8ZETGgt3fJPTP0RGR/9957L958800VjEpzO3O5/eDBg1XQLMtTTz1l2f5///sffvvtN3zzzTelCuglAN+3b596jgTr4rXXXkPfvn0LbffCCy8UyvDLay5cuFAF9JJtlyBXLkBIiX1xFixYgKysLHz++eeWMfzvv/++yoC/8cYb6qKCkGy4rJfgulGjRujfvz9WrVpVroBenicXII4ePYrq1aurdfL6kmmXiwrt27dXGfynn35avZaoX7++5fnymHzWUvkgpDqBiNyL6fBaRCdsQo5Jjwvtx8FL70ZFsDK3/eCPgQ+7axeyB30ENB/i6KMionwM6O0g2DxtHTP0RO7Fy1/LlDvqtUtJgszOnTtj/vz5KqCXjLU0xJsyZYp6XDL1EoBLAH/q1CmVTc7Ozi71GPm9e/eqQNcczAvJoF9q0aJFmDlzJg4fPqyqAiTTLRUBZSGv1bJly0IN+bp06aKy6Pv377cE9BJsSzBvJtl6CcrLw/z+zMG8kGEFoaGh6jEJ6MeNG6cqBb744gv06tULQ4cOVRUO4tFHH8VDDz2E33//XT0mwX15+hYQkZMymZD+60RI3c1C0w24uVtHuJ2IusAjmwBDLhBe29FHQ0QFuNHlQ+cV7GceQ8+AnsitSPm6lL07YiljAyIZK7948WKkpqaq7LwEm927d1ePSfb+3XffVSX3UqIu5eJS1i6BvbVs3LhRlaX369cPP/30E7Zv366GAFjzNQoyl7ubyVADCfptRTr07969W1UCrF69WgX8MtWekED/yJEjahiDXFSQRoTvvfeezY6FiOxs/y8ITNiJDJMPTjR9CGEB3nBLIdUYzBM5IQb0dmyKx5J7InIUaeKm0+lUybqUi0sZvnk8/V9//aXGiN91110q+y0l4QcOHCj1vhs3bowTJ06o6eXMNm3aVGibDRs2oGbNmiqIl4BWStKlWVxB3t7eqlrgSq8lDehkLL2ZHL+8t4YNG8IWzO9PFjMZBy9T3EngbiYN/5544gmViZeeAnLhxEyy+w8++CCWLFmCJ598EnPnzrXJsRKRnRkNyF2hVTvNN9yIId3bOvqIiKiCYUBvB0EsuSciB5Px6dLEbcKECSrwlk7wZhJcS1d6CbqlhPyBBx4o1MH9SqSMXILZkSNHqmBbyvklcC9IXkPGksuYeSm5l9J7cwa74Lh6GacuFQIJCQmq7P9SkuWXTvryWtJETyoKZMy/ZL/N5fblJRcT5LULLvJ5yPuT8e/y2tu2bcOWLVtUo0GpcJCLE5mZmaopnzTIk4sUcoFBxtbLhQAhDQKlv4C8N3m+HLP5MSIqJ5kf/Y83geyLM1w4xH+L4ZW4D8kmf+yscTcaxgQ59niIqMJhQG8HIZaSe2boichxpOz+woULqpy+4Hh3aVbXpk0btV7G2EtTOpn2rbQkOy7BuQS20kRPSsxfffXVQtvccsstKnstga90m5eLBzJtXUEytvzGG29U07/JVHtFTZ0n4/olOD5//rwauz5kyBD07NlTNcC7WjKuXzrVF1yk2Z5UMnz//feq0Z5MzScBvlQxSE8AIWP1Zeo/CfLlwoZUQ0hDQJmGz3yhQDrdSxAv70+2+eCDD676eIkqtOUTgDWvAItHqyy5Q+TlwLha+7fuw7ybMexa9sYgIvvzMJlKOZlxBZKSkqK6PsvUS2Vt2FSU5IxctJzyu7p94JW+8PbkdRQiVyOd1SXDWrt2bZUhJrL335m1z00VHT9PFyZfXd+oCWQla/c73K/NiV7G3iJX7e+PgZ/HId4UgrsCPsSvT90Inc7Ox0BEqOjnJkaWdhCYX3Iv2BiPiIiI6CpknL8YzIstHwGb59j3GHIzYfpjmrr5Xt5ADOvciME8ETkEA3o70Os8EOiTP46eZfdERERE5Zd4SPsZXA24YcrFEvx9P9vvGLbMhUfaWZw0ReJHz94Y2q6a/V6biKgABvR2noueGXoiIiKiq3D+sPYzog7Q+VGg7SipwwcW3wec2mb715fqgPXT1c0ZeYMxoG1tBOXPaEREZG8M6O3E/A99SiYz9ERERETllpgf0IfX1cbN93sLqNcLyM0AFgwDkmJt+/obZwGZF3DIWAXLjNfins61bPt6REQlYEBvJ8F+5pJ7ZuiJXBn7iJIt8e+LnIZ0jj+9Azi3G0g5DeRmwfky9HW1n3pPYMgnQHRTID0O+Oq2wmPsrSk9QQvoAbyVdxt6NKqMWpEBtnktIiJXCehnzZql5h+Wjr4dO3ZUc/wWZ+7cuejatauaPkgWmT7o0u1lfmWZZqjgIlMFOVJwfoaeJfdErsnLS/t/OCMjw9GHQm7M/Pdl/nsjsju5qHRwJTCnK/BRd2B2Z2B6Y+DVSsArMcD0JsDsLsCnNwGL7gZ+fAxYORn4ayaw7Qtg3y9AVop9xtBH1Lu4zjcYuPMbIKgyEL8X+GYEYLDBd6717wA5afjPVAfLje0xqktt678GEVEZXGy/7iAyj++4ceMwZ84cFczPmDFDzYW8f/9+REdHX7b92rVrMXz4cHTu3FldAHjjjTfQu3dv7N69G1WrVrVsJwH8J598Yrnv4+MDRwrOn4ueJfdErknmGg8NDUVcXJxlPnS5WEhkrcy8BPPy9yV/Z/L3RmR3Z3YCv78IHP1Du+8VAHj5qvJymIxAXiaQckpbSlK3J3D3EttdcEg8crHkvqCQasAdi4D5fYEja4GfHgdued9609kln1TN8MS03KFoWCkYnetGWGffRESuGtBPnz4dY8aMwahR0tAEKrD/+eefMX/+fDz77LOXbf/VV18Vuj9v3jwsXrwYq1atwogRIwoF8DExMXAWQflN8VhyT+S6zP+mmIN6ImuTYN6Zzl1UQSSdAFa/Avy7SGsup/fW5nbv+iTgHw4YjUB2ihbYq+U8kJmkTR9nuX8BSD0DHP0TOLFFC7xtcdEz7RyQmw546ICwIsauV24JDP0E+Pp2YPuXQHgd7X1Yg0xTZ8jGdl0T/GlsgaldavHCLhFV7IA+JycHW7duxYQJEyzrdDqdKqPfuHFjqfYhGY3c3FyEh4dflsmXDL+U5V9//fV45ZVXEBFR9FXU7OxstZilpKTYsOSeGXoiVyVf3CpXrqz+bZF/d4isScrsmZknu5KgXLq1b5qjAlWl2RCg54uFg2WdDvAL1RaUUGKelwO8GgPkpGrBfXAV2zXEC6kOeHoXvU2DPkDfacAvTwGrpgChNYHmQ67+deUCAYBXMoci1N8bA1tdrAwlIqqQAX1CQgIMBgMqVapUaL3c37dvX6n28cwzz6BKlSrqIkDBcvtBgwahdu3aOHz4MJ577jn07dtXXSQo6svS1KlT8dJLL8EuTfEyGQQQuTr5d4SBFxG5LAm8//lYyzhLdl3UvBboPQWo2rb8+5UAO7y2NsY9fr+NAvoixs8XpcMY4PwRYNMHwLKHtXL8GteU/3XXvAaYDNjq0wFbsxrioQ414OfN8wAROZ7DS+6vxuuvv46FCxeqbLyMpze7/fbbLbebN2+OFi1aoG7dumq7nj17XrYfqRCQcfwFM/TVq1e3zbR1LLknIiIiR5Ay+D3LgJUvAReOausiGwI3TNGy2tYoH5f9SdCdcACoex1s3uG+JL1fAS4cB/b/DHw9HLhvZemed6mzu4D/vlM3X0wZCL3OAyM61Sz7foiI3K3LfWRkpMpynTt3rtB6uX+lMYRvvfWWCuh///13FbCXpE6dOuq1Dh3Kv6p7CRlvHxwcXGixVck9m+IRERGR3R3fCMzrBXx7jxbMB1YCbn4XeGgD0PBG6413j2qg/ZQMva3noL8SnR4YPBeo0lqrRPhqqDbuv7QXP7LTtP4CcgEEwI7g67HHVAt9m8Wgcojf1bwLIiL3yNB7e3ujbdu2qqHdwIED1Tqj0ajujx07ttjnTZs2Da+++ip+++03tGvX7oqvc/LkSSQmJqqxr47CeeiJiIjIIfPJ//wksPWTi53ruzwKdBoL+ARa//UkQy8kQ28LUkYvSptp9w4Ahi8C5vXUsvsL7wCueVgL8As19SuiyZ8hx7Ibk4ce48/fpG5zqjoiciYOL7mXUveRI0eqwLxDhw5q2rr09HRL13vpXC/T0ck4dyHT1E2cOBELFixQc9efPXtWrQ8MDFRLWlqaGg8/ePBgleWXMfTjx49HvXr11HR4jmIuuWdTPCIiIrILQx6w7EFg17daV/g2I4AeE4AgG86kYMsMvXTbL2tAL4IqAXd+C3zcG4jdqC2lJR3//cKxKWIQDuyPQctqIWhTQ5oDEhE5B4cH9MOGDUN8fLwK0iU4b9WqFZYvX25plBcbG6s635vNnj1bdccfMqRwt9JJkyZh8uTJqoT/33//xWeffYakpCTVME/mqX/55ZcdOhd9sHnaOjbFIyIiIns0vlt8L7D3R0DnCQyZDzQZYPvXjcwP6NPjtCy3X5j19p1yCsjL0t5PSI2yPTe6sTZHvUzPJ1ULclwyJZ/8NC+W++EX73v5I8dgwmNvrJZ5kVR2nlPVEZEzcXhAL6S8vrgSe2lkV9CxY8dK3Jefn58qxXc2wX5ahj4tJw9Gowk6HU8GREREZAO5WcA3I4CDv2kZ5ts+Bxr2tc9r+wQBwVW14Dv+AFCjo/Ub4smUevpyfIWt2RkY9UuZn/bLrtOIS81GdJAP+jV33PBNIiKna4pXkQTlZ+ilx0pqNsvuiYiIyAZyMoCvb9eCeU8/YPhC+wXzl2bpE/Y7riGelWTk5OGTv7QZAe66pia8PfnVmYici1Nk6CsCH089fDx1yM4zqrL7kPyMPREREZFVZKcCC4YBx//Smt9JiXntrvY/jqiGwJE11h9Hbxk/f4U56MvIZDIhPi0bh+LScDg+HYfVzzQciU/HqaRMtY23Xoc7OpaxzJ+IyA4Y0Nu57D4+NZuN8YiIiMi6spKBL4cAJ7cAPsHAnd9Zt9y9XBl6K3e6l/ntRUSdcgfuxxIzcPBcqgrctQBeW0r6bhYe4I37u9VBZKDjejERERWHAb2dG+NJQM+p64iIiMhqZLq1L24FzuwAfEOBu5cCVds47ngkQy/inaPk/kxyJpZuP4Ul206pIL4o0tqoerg/6kUFom50IOpGBaCu3I4KRFiAtzWOnojIJhjQO2DqOna6JyIiIqtIiwc+HwDE7Qb8I4ERy4CY5o49JvNc9EmxQG4m4OVnnSn4Lhwr9ZR16dl5+G33WRXE/3U4QfUwEjIGvkElLVCXpZ4K3gNRM8Ifvl76qz9OIiI7Y0DvgE73KSy5JyIioquVcgb4/BattD0wBhjxPRDdyNFHBQREatO+ybR1CQeByi2uWAqfYzCqfkPFSj4BGHMBvQ8QXK3ITQxGEzYdScTibSex/L+zyMgxWB7rUDscg9tURd/mlRGcn2AhInIHDOgdMBd9KkvuiYiI6GoknQA+uxm4cFSbJm7kj6XKXNuFzNMuWfoTm7SLDSUE9NtiL2Dcoh04fj4DMcG+qBHur7LlNSMC1G3z/VBLuX0dQFe407yU0S/ZdlKV1Z9JzrKsrxXhj0FtquHW1lVVOT0RkTtiQO+Qkntm6ImIiKiczh8FPrsFSI4FQmsCI3/Q5mZ3JlENtIC+mHH0RqMJ89YfwbTl+5Fn1OrhJRiXZfPR85dt/4DvCkwAsCMjAr8v36eCfMnAL9t+CjtPJhdKntzUsorKxrepEQYPubhAROTGGNDbUbCf9nGzKR4RERGVi5SwSzCfelprDieZ+ZCqcDrmcfRFzEV/Pj0HT327E6v3xan7N7WojGdubKSmjotNzMDxxAzEnpclXd2OS81GTN5p9a11U3IoPlibn63P56nzQI+GUSobf32jaI6FJ6IKhQG9HZnHbLHknoiIiMrMaAC+GqIF81GNtDHzQTFwSpZO94Wnrvv72Hk8+vV2lYmXBnWTb26K4R2qq0y6lMVLVv1SmTkGGL74CDgBNG3WGnf71lQl+jl5BvRpGoObW1bhlHJEVGExoHdEUzyW3BMREVFZSdd46fQujeHu+VlrPueszHPRy9zxhjwYPfSY/cdhTF9xQDWvqxMZgFl3tkHjysFX3JWftx5I0zrcd73mGnSt1czWR09E5DIY0DugKR5L7omIiKhc5fYiop5zB/MipDrg5Q/kZuD8qQN4fGUa/jwQrx6SJnWvDGyGAJ9Sfg3Ny9EuZpRjDnoiInfHgN4BJfcM6ImIiKjMzOPRpeGcs5NO9HLh4ey/eO2zZfgzvSV8vXSYckszDG1XrWzN6pKOAyYj4BXgvEMMiIgcpPC8H2SXpnipnIeeiIiIykqmgCtYzu7EpKx+n6GKuh2VdRz1ogPx/SPX4rb22nj5MjFPWRdRR5sSj4iILJihd8i0dczQExERUTlL7p08oI9LzcITi3ag9ekgNPICekZewP8e6QJ/73J+7ZRx+ILl9kREl2FA75CS+zyYTCbOjUpERETlyNDXh7P661ACHlu4Awlp2Yjwqq7WtQuIB8obzIvz5gw9A3oiokux5N4BJfdShpaZa3D04RAREZGrSE8EMhK12zI23cmkZedh0vf/4a6PN6tgvmGlIDx5500XKwtMpvLv3Fxyzww9EdFlmKG3Iz8vPfQ6DxXQy9R15S49IyIioool8eDF7vHeAXAma/bH4fklu3A6OUvdl3nlJ97UFH46A+ChB3JSgZTTQEjV8r3A+SNOeyGDiMjRGFHakZTYy9R1FzJyVaf7mBBfRx8SERERuQInLLc/n56DKT/uxrIdp9X9amF+mDqoObrWj8rfQg+E19EuRkiH/vIE9LmZQPIJ7TZL7omILsOSezsL9tPG0ady6joiIqpAZs2ahVq1asHX1xcdO3bEli1bit02NzcXU6ZMQd26ddX2LVu2xPLlywttYzAY8OKLL6J27drw8/NT27788suqR41bcqIO9/IZf7/jFHpN/0MF8zoPYPS1tfH7E90KBPP5ohpqP+Pzj7+szh/VfvqEAP4RV3nkRETuhxl6RzXGy+TUdUREVDEsWrQI48aNw5w5c1QwP2PGDPTp0wf79+9HdHT0Zdu/8MIL+PLLLzF37lw0atQIv/32G2699VZs2LABrVu3Vtu88cYbmD17Nj777DM0bdoU//zzD0aNGoWQkBA8+uijcDvxzhHQn07KxPNLd2HN/nh1X8bKvzGkBVpVDy36CebjlQz9VTXE45R1RERFYYbezoJ8tWsoUnJPRERUEUyfPh1jxoxRAXeTJk1UYO/v74/58+cXuf0XX3yB5557Dv369UOdOnXw0EMPqdtvv/22ZRsJ7gcMGID+/furzP+QIUPQu3fvYjP/2dnZSElJKbS4FAdn6I1GEz7feAw3TP9DBfPeeh3G3dAAP/7v2uKDeWtk6C1z0HP8PBFRURjQOyxDz4CeiIjcX05ODrZu3YpevXpZ1ul0OnV/48aNxQbfUmpfkJTVr1+/3nK/c+fOWLVqFQ4c0ALFnTt3qsf79u1b5D6nTp2qsvfmpXp1bUo1l5CbBSQdd1hAfyguDbd9uBETv9+N9BwD2tYMw8+PXotHe9aHt+cVvkpebYaec9ATEZWIJfcOmrpO5qInIiJydwkJCWq8e6VKlQqtl/v79u0r8jlSji9Z/W7duqmx8RK4L1myRO3H7Nlnn1VZdinJ1+v16rFXX30Vd955Z5H7nDBhgir7N5PnukxQL13eTUZtHHng5UMUbCXXYMSHfxzGzFWHkGMwIsBbj/E3NsLd19SETgbOl4Y5oE+PBzLOA/7h5exwz4CeiKgoDOjtLMicoWfJPRERUZHeffddVaIvwbrMECNBvZTrFyzR/+abb/DVV19hwYIFagz9jh078Pjjj6NKlSoYOXLkZfv08fFRi8t3uLfTOPKNhxPx0o+7se9sqrrfo2EUXr21OaqG+pVtRz6BQHA1IOWk9j5qXFO253MOeiKiEjGgtzM2xSMioookMjJSZdDPnTtXaL3cj4mJKfI5UVFRWLZsGbKyspCYmKiCdMnIy3h6s6efflqtu/3229X95s2b4/jx46q0vqiA3qUlHLRbuf2uk8mY9ts+rDuYoO6H+Xth0s1NMaBVFXVxpVyiGmgBffz+sgX02WlA2tmLTfGIiOgyHEPvoJJ7TltHREQVgbe3N9q2bavK5s2MRqO636lTpxKfK+Poq1atiry8PCxevFg1wTPLyMhQY/ELkgsHsm+3Y4c56GWc/ENfbsXN769XwbynzkOV1q8c1x0DW1ctfzAvIhsWfh9l7XAv09X5hZX/9YmI3Bgz9A4ruWeGnoiIKgYZuy5Z83bt2qFDhw5q2rr09HRVRi9GjBihAnfJrovNmzfj1KlTaNWqlfo5efJkFaiPHz/ess+bb75ZjZmvUaOGKrnfvn27Gnd/7733wu3YsMP9qaRMzFhxAIu3nYTRpFX039qqKh7v1QA1Ivyt8yKSoReSoS8LltsTEV0RA3o7CzZPW8cu90REVEEMGzYM8fHxmDhxIs6ePasC9eXLl1sa5cXGxhbKtkupvcxFf+TIEQQGBqop62Qqu9DQi9Ojvffee3jxxRfx8MMPIy4uTpXlP/DAA+o13IpUHJhL7s1TwFlBQlo2Zq05hK82xaqGd+KGJpXwVO+GaBgTBKuyZOj3l3MOegb0RETFYUBvZ8F+bIpHREQVz9ixY9VSlLVr1xa63717d+zZs6fE/QUFBalMvyxuLfU0kJsO6DyBsFpXvTv5/jHvzyOYt/4oMnK0WQM61YnA0zc2RJsaNiprN1+ISDoB5GQA3qXM/Ceywz0R0ZUwoHdQU7xUltwTERFRacvtw+sAeu07RHlk5Rrw+cZj+GDtYSRlaEmFFtVCML5PI3SpF3F1Y+SvJCAS8AsHMs8DiQeByi1L9zzOQU9EdEUM6O0siCX3REREZMcO96v3ncNzS/7D2ZQsdb9edCCe6t0AfZrG2DaQvzRLH7sRiD9Q+oCeJfdERFfEgN5BJffZeUZk5xng46l39CERERGRm3a4Pxyfhke+2o7MXIOaQ/7xXvUxqE016HV2CuTN5IKEBPSlHUefmQRkJF6sTiAioiIxoLezIB9P1UHWZNLK7n0CGdATERGR9TvcS+Lg0a+1YL5z3Qh8Mqq94xIJ5nH0pe10b87OB8YAPlZu0kdE5EY4D72d6XQeCPRm2T0RERHZtuT+7d8PYPfpFIT5e2H6ba0cWxVY1rno2RCPiKhUGNA7tNM9G+MRERFRMbJSgNQz2u2IemV66vqDCfjoTy0ofmNwC8SE+MKhzHPRy9zyhrwyNMRjuT0RUUkY0DuwMV4qp64jIiKiK2XnAysBfqGlftr59ByM+2aHun1nxxro3TQGDhdcDfDyB4y5wIWjV96eDfGIiEqFAb0jM/SZzNATERGR9cbPm0wmjP/uX8SlZqtu9i/0bwKnoNNdbOxXmnH0kskvR2UCEVFFw4DeAYLNU9cxQ09ERERWDOi/3ByLlXvPwVuvw7u3t4KftxM137WMo79CQC+dg80Zes5BT0RUIgb0DhDsa87QM6AnIiIi6wT0B8+l4pWf9qjb429siKZVQuBUzOPoZS76ksh0dVnJ2u3w2rY/LiIiF8aA3oEl9zJtHREREVHJHe6vPAd9Vq4B//t6O7LzjOjWIAr3dnHCQLi0GXpzub0ad+9n++MiInJhDOgd2BSPJfdERERUJEMucP5IqTP005bvx76zqYgI8MZbQ1uoaXKdjnkuerlQIWX1xWFDPCKiUmNA7wAsuSciIqISXTiudYSXzvDBVUvcdM3+OMz/S+sc/+bQFogOcvAUdcWRKeh0nkBOGpByqhQN8RjQExFdCQN6Bwj2M09bx5J7IiIiKoK5LF26vEuH+GLEp2bj6W93qtv3dK6F6xtVgtPSe12cV76kTveWOegZ0BMRXQkDegcIMmfoWXJPRERE5WyIJ1PUPf3dTiSk5aBhpSA827cRnJ75/ZjfX1FYck9EVGoM6B1acs8MPREREZXQEM887rwIn244hrX74+HtqcPM4a3h6+VEU9QVx/x+isvQy9j6xPzeAZyDnojoihjQO7Dknhl6IiIiKjlDX3SH+71nUjD1133q9vP9GqNhTBBcgqXTfTEZ+rRzQG464KEDQmva9dCIiFwRA3oHZug5hp6IiIiKzFKXUHIvU9Q9+vV25OQZcX2jaIzo5EKBr2Uu+v0lj58PrQF4etvvuIiIXBQDegdOW5eWnYc8g9HRh0NERETOJD0eyEoG4FFkY7jXftmLg3FpiArywZtDWsDDwwmnqCuO+QJFRgKQcb74DvdsiEdEVCoM6B3YFM8c1BMRERFZmLPzYTUBr8JT0K3ccw6fbzyubr89tCUiAn3gUrwDgJDqxWfpLQ3xOH6eiKg0GNA7gDSv8ctvXMOyeyIiIiqkmHL7jJw8PLvkX3X7vmtro1uDKLgkS6f7IgJ6zkFPRFQmDOgdXHafnMnGeERERFRAfNEB/eJtp9QUdTXC/fH0jcV3v3edTvdFNMZjyT0RkesF9LNmzUKtWrXg6+uLjh07YsuWLcVuO3fuXHTt2hVhYWFq6dWr12Xby7ysEydOROXKleHn56e2OXgwf/oXJxHsx7noiYiIqHQd7o1GE+avP6pu39ulFnw8XWCKurJm6I1G4IL2HhFRx/7HRUTkghwe0C9atAjjxo3DpEmTsG3bNrRs2RJ9+vRBXFxckduvXbsWw4cPx5o1a7Bx40ZUr14dvXv3xqlTpyzbTJs2DTNnzsScOXOwefNmBAQEqH1mZWXBWQTnZ+hZck9ERERFzkFfIEO/el8cjiakqwq/oe3yx6C7W4Y+5RSQlwXovICQGg45NCIiV+PwgH769OkYM2YMRo0ahSZNmqgg3N/fH/Pnzy9y+6+++goPP/wwWrVqhUaNGmHevHkwGo1YtWqVJTs/Y8YMvPDCCxgwYABatGiBzz//HKdPn8ayZcvgbI3xUlhyT0RERGY5GUBybOE52wHMW39E/byjYw0E+GhJAZdlfl/yPnPSL2+IF1YL0Lv4eyQiqggBfU5ODrZu3apK4i0HpNOp+5J9L42MjAzk5uYiPDxc3T969CjOnj1baJ8hISGqlL+4fWZnZyMlJaXQYr+Se2boiYiI6JJ52P3CgYAIdfO/U8nYdOQ8PHUeuKdzLbg8eV/+EYWrEQq+dzbEIyJyjYA+ISEBBoMBlSpVKrRe7ktQXhrPPPMMqlSpYgngzc8ryz6nTp2qgn7zImX89iq5Z4aeiIiISupwbx473695ZVQO8YNbMGfpze9XJGpVCGyIR0TkQiX3V+P111/HwoULsXTpUtVQr7wmTJiA5ORky3LixAnYK0PPMfRERER0+fh5rSHe2eQs/LDztLp9X9facBvmhn8F56K3zEHPgJ6IqLQcOkApMjISer0e586dK7Re7sfExJT43LfeeksF9CtXrlTj5M3Mz5N9SJf7gvuUcfdF8fHxUYsjpq1jl3siIiIqLkP/+cZjyDOa0KFWOFpUC4XbMDfGK9jpnnPQExG5Vobe29sbbdu2tTS0E+YGd506dSr2edLF/uWXX8by5cvRrl27Qo/Vrl1bBfUF9ylj4qXbfUn7tLdgNsUjIiKiEgL6jJw8LNiiNcgb7U7Z+YIl9+ZO94a8i1PWseSeiKjUHN5CVKasGzlypArMO3TooDrUp6enq673YsSIEahataoa5y7eeOMNNcf8ggUL1Nz15nHxgYGBavHw8MDjjz+OV155BfXr11cB/osvvqjG2Q8cOBDOgiX3REREVIjRcLExXGR9LN52CkkZuagZ4Y9ejQv3BnJ5UQ0ultkbcoHkE4AxD/D0BYKrOvroiIhchsMD+mHDhiE+Pl4F6RKcS1m8ZN7NTe1iY2NV53uz2bNnq+74Q4YMKbQfmcd+8uTJ6vb48ePVRYH7778fSUlJuPbaa9U+r2acvbWx5J6IiIgKkaBW5mHXe8MYUgPz1/+lVo/qXAt6nQfcSnA1wMsfyM0Azh8FkvKn6guvI1MeOfroiIhchsMDejF27Fi1FGXt2rWF7h87duyK+5Ms/ZQpU9TirCwl9wzoiYiIqGBDvIh6WH3gPI4mpKsEwNB2tp99x+4kaJfGeGd2auPoU05fDOiJiKjUeAnUQUL8tGspLLknIiKiwuPn62Peem0Ktzs61kCAj1PkX2w4jn4/G+IREZWTm54hnF9QgaZ4JpNJVRUQERFRBZYf0Mf51MSmI+fhqfPAPZ1rwW2Zx9HL+05P0G6zIR4RUZkwoHdwyb3RBKTnGBDorlffiYiIqEwl97+fC1Y/+zWvjMohfnBbBTP0WUna7Yh6Dj0kIiJXwyjSQXy9dPDSeyDXYFJZegb0REREFVx+hv7b41oQf5+7TVVX7Fz0B7RmgIIl90REZcIx9A4iJfbmLD3H0RMREVVwGeeB9Hh186ChMjrUCkeLaqFwa6qjvafW6d5kBLwDgUA3m56PiMjGGNA7EKeuIyIiooLl9mcRgQz4YrS7Z+eF3qtwV/vw2pLxcOQRERG5HAb0DhTsd7ExHhEREVVg+eX2kp2vEe6PXo0rSKY6Mr8xnuD4eSKiMmNA70AsuSciIiJhitcC+kOmqri3Sy3odRUkU20eRy/Y4Z6IqMwY0DsQS+6JiIhIJBz/T/085VkNQ9tVR4Vh7nQv2BCPiKjMGNA7QYaeJfdEREQVW965/epnnUatEVCRZr4xz0UvmKEnIiozBvQOFOxnztCz5J6IiKii2h0bh6i8M+r29ddeiwpFxtDrvAAPHRBZ39FHQ0TkcirQJWDnE2QZQ88MPRERUUX109q/0NTDiCydP2Kq1kKF4h0ADP0UMGQD/uGOPhoiIpfDgN6Bgs1j6DOZoSciIqqIzqVkIXb/DsALMEbUr5jTtjW+ydFHQETkslhy7wzT1jFDT0RE5LpMJmDvj4DRUOanfr7xGGrhtLrtX7mxDQ6OiIjcGQN6Z2iKxzH0REREruuXp4BFdwGrXy7T0zJy8vDV5ljU1WkBPceQExFRWTGgd4Jp61LZ5Z6IiMh11eik/Vz/DrB7aamftnjbKSRl5KKx19mLDeKIiIjKgAG9A7HknoiIyA00HwJ0/p92e9nDwLndV3yK0WjC/PVHpV4f9TzyM/RRBeZkJyIiKgUG9E4R0LPknoiIyKX1nAzU6QHkZgAL7wAyzpe4+bbYCziakI66vqnwMmQAHnogrLbdDpeIiNwDA3onKLnPyTMiK7fsjXSIiIjISeg9gSGfAKE1gQvHgMWjS2ySF5earX52C8sP/MNrA57e9jpaIiJyEwzoHSjQ29MyOw3L7omIiFyczKN++1eApx9weDWwakqxm6bk98+pay635/h5IiIqBwb0DqTTeSDIh3PRExERuY2Y5sCA97Xbf80A/ltc5Gap+cPtahhPaivY4Z6IiMqBAb2DBeVPXZfKDD0REZEbNcl7VLv9/Vjg7K7LNjGf96vmndBWMENPRETlwIDewdgYj4iIyA31mgzUvT6/Sd6dlzXJM5/3o3NitRUM6ImIqBwY0DtYcH5jPPNYOiIiInIDOj0w+GMgrBaQdBz47l7AkFeo5D4AmQjKiddWsOSeiIjKgQG9k2TozWPpiIiIyJ2a5C0AvPyBI2uAVS8VKrmv43FGuxMQDfiFOe44iYjIZTGgd5Kp69jlnoiIyA1VagoMmKXd3jAT2PWd5UI+O9wTEdHVYkDvYMH5TfFYck9ERO5s1qxZqFWrFnx9fdGxY0ds2bKl2G1zc3MxZcoU1K1bV23fsmVLLF++/LLtTp06hbvuugsRERHw8/ND8+bN8c8//8DpNBsEdHm8UJO81Oxc1NWZA3qW2xMRUfkwoHeapngM6ImIyD0tWrQI48aNw6RJk7Bt2zYVoPfp0wdxcXFFbv/CCy/gww8/xHvvvYc9e/bgwQcfxK233ort27dbtrlw4QK6dOkCLy8v/Prrr2q7t99+G2FhTlq63nMiULcnkJcJLLwDHpnnUc/jlPYYM/RERFRODOidpCkex9ATEZG7mj59OsaMGYNRo0ahSZMmmDNnDvz9/TF//vwit//iiy/w3HPPoV+/fqhTpw4eeughdVsCdrM33ngD1atXxyeffIIOHTqgdu3a6N27t8rqO2+TvHlAWG0gKRYvZLyJBh7mOegZ0BMRUfkwoHcwltwTEZE7y8nJwdatW9GrVy/LOp1Op+5v3LixyOdkZ2erUvuCpKR+/fr1lvs//PAD2rVrh6FDhyI6OhqtW7fG3Llziz0O2WdKSkqhxVFN8kxeAeiIXairy2+Kx5J7IiIqJwb0DhbsZ26Kxww9ERG5n4SEBBgMBlSqVKnQerl/9uzZIp8j5fiS1T948CCMRiNWrFiBJUuW4MyZ/AAYwJEjRzB79mzUr18fv/32m8riP/roo/jss8+K3OfUqVMREhJiWSS77xCVmiDnpvctd02evkCIg46FiIhcHgN6BwvKz9DL9DVEREQEvPvuuypQb9SoEby9vTF27FhVri+ZfTMJ9Nu0aYPXXntNZefvv/9+VdYv5fxFmTBhApKTky3LiRMn4CjJtfthVt4t2p1KzaVkwWHHQkREro1nEKcpuWeGnoiI3E9kZCT0ej3OnTtXaL3cj4mJKfI5UVFRWLZsGdLT03H8+HHs27cPgYGBajy9WeXKldV4/IIaN26M2NjYIvfp4+OD4ODgQoujSFXe23m34Wk8Bo9bZzvsOIiIyPUxoHeakntm6ImIyP1Ihr1t27ZYtWpVoey63O/UqVOJz5Vx9FWrVkVeXh4WL16MAQMGWB6TDvf79+8vtP2BAwdQs2ZNODupyjNChw2+PTh+noiIrooWTZLDM/QZOQbkGYzw1PMaCxERuReZsm7kyJGqiZ10pJ8xY4bKvksZvRgxYoQK3GWcu9i8ebOaY75Vq1bq5+TJk9VFgPHjx1v2+cQTT6Bz586q5P62225T89p/9NFHanF25pltgvJnuiEiIiovnkkcLLDAyVxO8GEB3g49HiIiImsbNmwY4uPjMXHiRNUITwL15cuXWxrlSZl8wfHxWVlZai56aXwnpfYyZZ1MZRcaGmrZpn379li6dKkaGz9lyhQ1bZ1cKLjzzjvhKgG9+aI+ERFReTGgdzAvvQ7+3nqVoZeyewb0RETkjqSxnSxFWbt2baH73bt3x549e664z5tuukktrsbcCJcZeiIiulqs73YCbIxHRERUcbDknoiIrIUBvRMwn9A5dR0REZH7MzfCNU9dS0REVF4M6J1AsF9+hp4BPREROYFatWqpcenFTQFHV4cZeiIishYG9E4gOP+EzpJ7IiJyBo8//jiWLFmi5n2/4YYbsHDhQmRnZzv6sNwGM/RERGQtDOidgPmEzgw9ERE5S0C/Y8cONRVc48aN8b///Q+VK1dWTe22bdvm6MNzeczQExGRtTCgdwLBfvkZ+vwTPBERkTNo06YNZs6cidOnT2PSpEmYN2+emi5Opp2bP38+TCaTow/RJZl75piH3BEREZUXLw07VZd7ZuiJiMh55ObmqrneP/nkE6xYsQLXXHMNRo8ejZMnT+K5557DypUrsWDBAkcfpsthhp6IiKyFZxInwKZ4RETkTKSsXoL4r7/+GjqdDiNGjMA777yDRo0aWba59dZbVbaeyh/Qm3voEBERlRfPJE41bR1L7omIyPEkUJdmeLNnz8bAgQPh5XV5aXjt2rVx++23O+T43KXknk3xiIjoajGgdwIsuSciImdy5MgR1KxZs8RtAgICVBafykb6DrDknoiIrIVN8Zyq5J4ZeiIicry4uDhs3rz5svWy7p9//nHIMbmLzFwD8oxaM0Fm6ImI6GoxoHeqkntm6ImIyPEeeeQRnDhx4rL1p06dUo9R+Zmz8zoPIMBb7+jDISIiF8eA3gmw5J6IiJzJnj171JR1l2rdurV6jMrPfPE+0McTHh4ejj4cIiJycQzonWge+tTsPBjzy/CIiIgcxcfHB+fOnbts/ZkzZ+DpyXHfV8M8vI7l9kREZA0M6J0oQ28yAek5HEdPRESO1bt3b0yYMAHJycmWdUlJSWrueel+T+XHhnhERGRNPJs4AR9PHbz1OuQYjOrKPa/aExGRI7311lvo1q2b6nQvZfZix44dqFSpEr744gtHH55blNybG+ISERG5dIZ+1qxZqFWrFnx9fdGxY0ds2bKl2G13796NwYMHq+1l3NmMGTMu22by5MnqsYJLo0aN4MzkGM1l9xxHT0REjla1alX8+++/mDZtGpo0aYK2bdvi3Xffxa5du1C9enVHH55bZOiDmaEnIiIrcOjZZNGiRRg3bhzmzJmjgnkJ0Pv06YP9+/cjOjr6su0zMjJQp04dDB06FE888USx+23atClWrlxpue8K4/2k7D4hLYcBPREROQWZZ/7+++939GG4bYae1XhERGQNDo10p0+fjjFjxmDUqFHqvgT2P//8M+bPn49nn332su3bt2+vFlHU4wUD+JiYGLjm1HUcQ09ERM5BOtrHxsYiJyen0PpbbrnFYcfk6jiGnoiIrKlcZxOZm1bKxKtVq6buS5n8ggULVFleaa/my5eDrVu3qqY7ZjqdDr169cLGjRtxNQ4ePIgqVaqoMv5OnTph6tSpqFGjRrHbZ2dnq8UsJSUF9mYeS5fCueiJiMjBjhw5gltvvVWV2Mv53iRdW/OHiAmDweDgI3Rd5ko8BvREROSwMfR33HEH1qxZo26fPXtWdbyVoP7555/HlClTSrWPhIQE9YVAGuwUJPdln+Ulpfuffvopli9fjtmzZ+Po0aPo2rUrUlNTi32OBPwhISGWxRHjAzkXPREROYvHHnsMtWvXRlxcHPz9/VUPmz///BPt2rXD2rVrHX14bpKhZ8k9ERE5KKD/77//0KFDB3X7m2++QbNmzbBhwwZ89dVXKph2pL59+6ox9i1atFDj8X/55Rc11Y4cZ3HMU/OYF6lAsDeW3BMRkbOQSjm5QB8ZGamq52S59tpr1QXwRx991NGH5ybz0DNDT0REV69cZ5Pc3Fz4+Pio29J8zjyWTrrJnzlzplT7kC8Jer0e586dK7Re7ltz/HtoaCgaNGiAQ4cOFbuNvBfz+3EUltwTEZGzkAq6oKAgy/n69OnTaNiwoZrGThrXUvmxKR4RETk8Qy9d5KWB3bp167BixQrceOONar2c8CMiIkq1D29vbzUNzqpVqyzrjEajui/j3q0lLS0Nhw8fRuXKleHMzNPXpGQyQ09ERI4llXc7d+60DGWT6ev++usvlbWX2Wao/NgUj4iIrKlcZ5M33nhDNct58803MXLkSLRs2VKt/+GHHyyl+KUhU9bJ82VMnjxPpq1LT0+3dL0fMWKEmgtXSvzMjfSk46759qlTp7Bjxw4EBgaiXr16av1TTz2Fm2++WWUR5ALDpEmTVCXA8OHD4czMV+pTs5mhJyIix3rhhRfU+VhIEH/TTTepfjRy0V6mnKXyM5/nzb1ziIiI7B7Q9+jRQzW1k27wYWFhlvXS4V6a55TWsGHDEB8fj4kTJ6pGeK1atVLN7MyN8mSqHBm3ZyYBeuvWrS3333rrLbV0797d0qTn5MmTKnhPTExEVFSUGvO3adMmdduZBfsxQ09ERM5BetCYyQXzffv24fz58+qcb+50T1eXoTdX5hEREV2Ncp1NMjMz1RQ25mD++PHjWLp0KRo3blzoS0BpjB07Vi1FubSTbq1atSxT5xRn4cKFcEWWLvccQ09ERA4kfXL8/PxUBZyU3puFh4c79LjcgXyHYZd7IiJy+Bj6AQMG4PPPP1e3pYO8jK97++23MXDgQDVVHF1FUzxOW0dERA7k5eWFGjVqcK55G8jMNcBg1BITHENPREQOC+i3bdumxtKJ7777TpXIS5ZegvyZM2da5cAqGk5bR0REzuL555/Hc889p8rsyXrM53i9zgP+3npHHw4REbmBcl0ezsjIsExn8/vvv2PQoEFqrPs111yjAnu6upJ7KcnjGEUiInKU999/X033WqVKFdVkNiAg4LIL+1R25iq8QB9PnueJiMhxAb00yFm2bJnqdP/bb7/hiSeeUOvj4uIQHBxsnSOroCX3uQYTsnKN8OOVeyIichAZQkfWl8Ip64iIyMrKdUaRrvR33HGHCuSvv/56y7zxkq0v2IWeSi/AWw+dByBD61KzchnQExGRw8iUr2R9cn4XbIhHREQODeiHDBmipoM7c+aMZQ560bNnT5W1p7KT0js5wSdn5qqy++hgX0cfEhEREVnRxQ73zNATEZF1lPuMEhMToxaZ911Uq1YNHTp0sNJhVUwyF70E9Mmci56IiBxI+uKUNMabHfCvdg56ZuiJiMiBAb3RaMQrr7yipqpLS0tT66RJ3pNPPqk648oXASq7IB85wWdyLnoiInKopUuXXjY3/fbt2/HZZ5/hpZdecthxuUvJfTAz9EREZCXlOqNI0P7xxx/j9ddfR5cuXdS69evXY/LkycjKysKrr75qreOrcBl6wanriIjIkQYMGFDkcLumTZti0aJFGD16tEOOy9Wx5J6IiKytXGcUuUI/b9483HLLLZZ1LVq0QNWqVfHwww8zoL/aqevyp7UhIiJyJjI97f333+/ow3BZbIpHRETWVq7a+PPnz6NRo0aXrZd18hhd3dR1LLknIiJnk5mZiZkzZ6qL91Q+zNATEZG1leuMIp3t33//fXViL0jWSaaeysd8gmfJPREROVJYWFihpngmkwmpqanw9/fHl19+6dBjc2XmC/bM0BMRkUMD+mnTpqF///5YuXKlZQ76jRs34sSJE/jll1+sdnAVDUvuiYjIGbzzzjuFAnppdhsVFYWOHTuqYJ/KJ4UZeiIisrJynVG6d++OAwcOYNasWdi3b59aN2jQIDWuTrrfd+3a1drHWcFK7pmhJyIix7nnnnscfQhuiSX3RERkbeU+o1SpUuWy5nc7d+5U3e8/+ugjaxxbBS65Z4aeiIgc55NPPkFgYCCGDh1aaP23336LjIwMjBw50mHH5srYFI+IiKyNE8Y7EZbcExGRM5g6dSoiIyMvWx8dHY3XXnvNIcfkThn6kPxpaomIiK4WA3onnIeeJfdERORIsbGxqF279mXra9asqR6jspPGgmnZ5pJ7ZuiJiMg6GNA7EWboiYjIGUgm/t9//71svQyti4iIcMgxubqMHAMMRpO6zTH0RERkLWU6o0jju5IkJSVd7fFUaOaAntPWERGRIw0fPhyPPvoogoKC0K1bN7Xujz/+wGOPPYbbb7/d0Yfnkszndr3OA35eekcfDhERVcSAPiQk5IqPjxgx4mqPCRW95D4z14CcPCO8PVlAQURE9vfyyy/j2LFj6NmzJzw9tXOT0WhU53iOob/ahniehaYEJCIisltAL11vyXYCfTwLnfgjAn0cejxERFQxeXt7Y9GiRWoq2h07dsDPzw/NmzdXY+ipfFIKBPRERETWwrOKE/HU6xDgrUd6jkGV5jGgJyIiR6pfv75a6OqZG94G+bAhHhERWQ9rup1MsF9+YzzORU9ERA4yePBgvPHGG5etnzZt2mVz01PZxtAzQ09ERNbEgN5pO92zMR4RETnGn3/+iX79+l22vm/fvuoxupox9MzQExGR9TCgdzLmK/fM0BMRkaOkpaWpcfSX8vLyQkpKikOOyV0y9OYGuERERNbAgN5JS+7NV/KJiIjsTRrgSVO8Sy1cuBBNmjRxyDG5OvN53VyJR0REZA28TOxkgs0ZepbcExGRg7z44osYNGgQDh8+jOuvv16tW7VqFRYsWIDvvvvO0YfnkjiGnoiIbIFnFSfDpnhERORoN998M5YtW6bmnJcAXqata9myJVavXo3w8HBHH55LYkBPRES2wLOKkzGf6M0nfiIiIkfo37+/WoSMm//666/x1FNPYevWrTAYDI4+PJfDpnhERGQLHEPvtF3umaEnIiLHko72I0eORJUqVfD222+r8vtNmzY5+rBcex56ZuiJiMiKeFZxMiy5JyIiRzp79iw+/fRTfPzxxyozf9tttyE7O1uV4LMhXvmZL9QzQ09ERNbEDL3TTlvHknsiIrL/2PmGDRvi33//xYwZM3D69Gm89957jj4st8Ax9EREZAsM6J0MS+6JiMhRfv31V4wePRovvfSSGj+v1+uttu9Zs2ahVq1a8PX1RceOHbFly5Zit83NzcWUKVNQt25dtb005Fu+fHmx27/++uvw8PDA448/Duefto4BPRERWQ8Deqedh54ZeiIisq/169cjNTUVbdu2VUH3+++/j4SEhKver8xpP27cOEyaNAnbtm1TAXqfPn0QFxdX5PYvvPACPvzwQ1UdsGfPHjz44IO49dZbsX379su2/fvvv9W2LVq0gLMymUxIy9bO65yHnoiIrIkBvbOW3DNDT0REdnbNNddg7ty5OHPmDB544AEsXLhQNcQzGo1YsWKFCvbLY/r06RgzZgxGjRqlxuHPmTMH/v7+mD9/fpHbf/HFF3juuefQr18/1KlTBw899JC6LY35CkpLS8Odd96pjjksLAzOKj3HAKNJu80x9EREZE0M6J2M+cp9Wk4ejOazPxERkR0FBATg3nvvVRn7Xbt24cknn1Rl7dHR0bjlllvKtK+cnBw11V2vXr0s63Q6nbq/cePGIp8jTfik1L4gPz8/dTwFPfLII2poQMF9F0f2KU3+Ci72Lrf31HnA14tfvYiIyHp4VnHSDL3JBKTml+cRERE5ijTJmzZtGk6ePKnmoi8rKdmXeesrVapUaL3cl476RZFyfMnqHzx40FIdsGTJElU5YCbVA1K+P3Xq1FIdh2wXEhJiWapXrw5HNMSTsf5ERETWwoDeyfh66eHjqf1aWHZPRETOQhrkDRw4ED/88IPNX+vdd99F/fr10ahRI3h7e2Ps2LGqXF8y++LEiRN47LHH8NVXX12WyS/OhAkTkJycbFlkH/bO0LPcnoiIrI0BvRMyn/DZGI+IiFxdZGSkuhhw7ty5QuvlfkxMTJHPiYqKUvPep6en4/jx49i3bx8CAwPVeHohJfzSUK9Nmzbw9PRUyx9//IGZM2eq21IRcCkfHx8EBwcXWuzFPBUtp6wjIiJrY0DvhIL9zHPRM0NPRESuTTLs0jV/1apVlnVSRi/3O3XqVOJzJftetWpV5OXlYfHixRgwYIBa37NnTzW2f8eOHZalXbt2qkGe3LbmdHvWYK64Y0BPRETWxjOLE+Jc9ERE5E5kyrqRI0eqoLtDhw6YMWOGyr5LGb0YMWKECtzN4+E3b96MU6dOoVWrVurn5MmT1UWA8ePHq8eDgoLQrFmzyxr5RUREXLbeGVwcQ8+SeyIisi4G9M48dR1L7omIyA0MGzYM8fHxmDhxomqEJ4H68uXLLY3yYmNjLePjRVZWlpqL/siRI6rUXqask6nsQkND4YoKNsUjIiKyJp5ZnFCwryeqIh6pmTmOPhQiIiKrkMZ2shRl7dq1he53794de/bsKdP+L92HMzE3xTNX4BEREVkLx9A7m5x0PHxuEv7yfQw1ji5y9NEQERGRlTL0csGeiIjImnhmcSYpZ4Cvh6Fpyk511//UBkcfEREREV0lTltHRES2wgy9szjzLzD3euDMTph02gk/IuMw/juV7OgjIyIioqvAMfRERGQrDOidwf7lwPwbgdTTQGRDeIz4Xq2u7XEWn6474OijIyIioqvALvdERGQrDOgdyWQCNs0GFg4HctOB2t2B0b8DNTvD4BUELw8Ddu/ahrPJWY4+UiIiIiqnFEvJPTP0RERkXQzoHcWQB/zyNLD8WcBkBNqMBO5aDPiFAh4e0FdqrDarazqBzzcec/TREhERUTmx5J6IiGyFAb0jZKWo5nf4ey4AD+CGl4Gb3wX0BUrxohupH/V1J7FgSywycjgnPRERkWtn6FlyT0RE1sWA3t6SYoH5fYBDKwFPP2DYF0CXR1VWvpDoJupHa58zSMrIxeJtpxxzvERERFRuRqMJadmcto6IiGyDAb09ndwKzO0JxO0BAmOAUb8AjW8uetsoLUPf0ueM+jl//VH1pYCIiIhcR3pOnmqZI4L9mKEnIiI3C+hnzZqFWrVqwdfXFx07dsSWLVuK3Xb37t0YPHiw2t7DwwMzZsy46n3aze5lwKf9gPQ4oFIzYMwqoGqb4reP1sbQB2eeQISvEUcT0rFmfxwqlOw04JsRwK7vHH0kREREVzV+3kvvAR9Ph3/tIiIiN+PQM8uiRYswbtw4TJo0Cdu2bUPLli3Rp08fxMUVHbhmZGSgTp06eP311xETE2OVfdqcXJZfNx34diSQlwXU7wPcuxwIqVby8wIrAX5h8DAZ8XBTo1o1b91RVCgHfwf2fA/8Mc3RR0JERHTVU9ZJMoKIiMhtAvrp06djzJgxGDVqFJo0aYI5c+bA398f8+fPL3L79u3b480338Ttt98OHx8fq+zTpvJygB/GAqte0u53fBAY/jXgE3Tl58pJP0rL0g+qngq9zgMbjyRi9+lkVBiJh7SfF47JIERHHw0REVGZpXLKOiIicseAPicnB1u3bkWvXr0uHoxOp+5v3LjRrvvMzs5GSkpKocUqTAYgfj/goQP6vgn0fQPQ6Uv//PxO92Fph9CveWV1++P1RyteQG/IBlJPO/poiIiIyoxT1hERkVsG9AkJCTAYDKhUqVKh9XL/7Nmzdt3n1KlTERISYlmqV68Oq/DyA27/GrjzO6Dj/WV/fn6ne8Ttw+hra6ubP+48jbiULFQICQcv3j5fgS5kEBGR+01Z58OGeEREZH3szgJgwoQJSE5OtiwnTpyw3s4Do4B6Pcv33PxO94jfi1bVQ9GuZhhyDSZ8vvE43J70Hkg8fPH+BQb0RETkepihJyIitwzoIyMjodfrce7cuULr5X5xDe9stU8Zjx8cHFxocQr5ne7VGPKcdNzXVcvSf7n5ODJzDHBr6QlAdoF+AczQExGRK2fofZmhJyIiNwrovb290bZtW6xatcqyzmg0qvudOnVymn06VEAkEBCl3Y7fjxuaxKB6uB+SMnKxZPtJuLXEAuX2ghl6IiJyQczQExGR25bcy/Ryc+fOxWeffYa9e/fioYceQnp6uupQL0aMGKHK4Qs2vduxY4da5PapU6fU7UOHDpV6ny7HXHYft1d1uh/VubalOZ7RaILbN8TT5Wc0mKEnIiIX7nIf7McMPRERWZ9DLxcPGzYM8fHxmDhxompa16pVKyxfvtzS1C42NlZ1qTc7ffo0Wrdubbn/1ltvqaV79+5Yu3ZtqfbpcqQx3rF1ahy9uK19dbyz4gCOxKdj7YE4XN/IRd9XaQP6mp2Ao39qAb2Mq+ccvkRE5IIZ+mBm6ImIyAYcfnYZO3asWopiDtLNatWqBZMEdVexT5eTP3WddLoXgT6euL1Ddcxdd1Rl6d02oE/ID+jr9dICehlPn3kB8A939JERERGVGkvuiYjIltjl3tlZpq7TMvRiZOdaqvz+r0OJ2HM6BW6doY9pDgTmNzRk2T0REbloyT2b4hERkS0woHeVMfQpJ4EsLXivFuaPvs20IHf+X24Y5BoNwPkj2u2IekB4He02G+MREZGLYYaeiIhsiQG9s/MLBYIqa7fj91tWj75Wa473/Y5TiEvJgltJOg4YcwFPXyC4GhCuvVdm6ImIyHUDemboiYjI+hjQuwLzfPRxeyyrWtcIQ9uaYcg1mPDFpuNwK4mHtZ/hdQFpihiWH9AzQ09ERC47Dz0z9EREZH0M6F1BVH5AH681xrs0S//lpuPIyjXA7cbPR9TVfjJDT0RELkiml03LZsk9ERHZDgN6l+p0fzFDL3o3qYRqYX64kJGLJdtOwW0kHLw4fl6YM/TmcfVEREQuIC0nT824KoJZck9ERDbAgN6lOt0XztB76nUY1UULdj9ef0RlAtwqQx9Zv3CGPu0skJPhuOMiIiIqx/h5b70OPp78ykVERNbHs4sriGp4MaDNOF/oodvaVVNz0x+OT8cfB+PhVmPozRl6vzDAJ0S7feGY446LiIioXFPWecLDw8PRh0NERG6IAb0r8AkCQmoUOY5euube3r66uv3xOjcYY56Trk3RVzCgly9B5iw9G+MREZGL4JR1RERkawzoXW4c/d7LHhrZuRZ0HsD6QwnYd1abq95lmcfJ+4UD/uEX17MxHhERuWyGnuPniYjINhjQu4qo4gP66uH+6NtMm6t+ztr8cnWX73Cfn50349R1RETkYpihJyIiW2NA72qN8S4puTe7v1sdVZm+bMdprNxzDi4roZiA3pKhZ6d7IiJyDSkM6ImIyMYY0LtByb1oWT0U9+XPS//M4n8Rn5oN1+5wX0yGniX3RETkIlhyT0REtsaA3lVESqd7DyAjAUgrupv9U30aolFMEBLTc/Ds4n9hMk9+6w4l9+YMffIJwKBlPIiIiJwZS+6JiMjWGNC7Cm9/IKyWdju+6Cy9j6ceM25vpea7XbUvDgu2xMKlyAWIxINFB/RBVQC9D2DM04J6IiIiJ5eSyQw9ERHZFgN6VxLdWPsZV/Q4etEoJhjjb9TmrX/lp704Ep8Gl5GRCGQla5UI4XUKP6bTXbygwcZ4RETkQhn6YGboiYjIRhjQu2RAv6fEze7tUhtd6kUgM9eAJxbtQK7BCJcqtw+pDnj5Xf44p64jIiIXHEMfzAw9ERHZCAN6VxLVuMRO92Y6nQfeGtpSZQR2nkzGe6vyy9idXYK53L5u0Y9z6joiInIhHENPRES2xoDeJTvd79HGm5egcogfXhvUXN1+f80hbD1+Aa7T4b5+0Y8zQ09ERC4Z0DNDT0REtsGA3pVE1Ac89No489SzV9z8phZVcGvrqjCaoErv07LzXLPDvRmnriMiIpecto4ZeiIisg0G9K7Ey/dis7hiOt1f6qUBTVE11A+x5zPw8o8lj713uMTDJZfcmzP0F45dsUKBiIjI0VhyT0REtsaA3mUb45UuoJdGPNNvawkPD2DRPyew/L8rZ/YdwmgAzh+5WIlQlNAagIcOyE0H0uLsenhERERlYTSakJbDknsiIrItBvRuHtCLjnUi8EA3Les9Ycm/iEvJgtORueUN2dpc8yHVit7G0wcIzn+MjfGIiMiJSTBvLiZjhp6IiGyFAb2riWpU5oBejLuhAZpUDsaFjFw8/d2/MDlbybp5/LwMKdDpi98uPH8ueo6jJyIiJ5aSqY2f99br4OtVwnmNiIjoKjCgdzXRTbSf8fvLNI7c21OHd29vBR9PHf44EI8vNh2HU0kwd7gvpiGeGaeuIyIiFxo/H+zH7DwREdkOA3pXIw3jdF5ATiqQfLJMT61fKQgT+moZ/ld/3otDcalwmQ73l01dlz/enoiIyAlxyjoiIrIHBvSuRu91MegtY9m9GNGpFrrWj0R2nhGPL9qBnDwjXCqg59R1RETkAjhlHRER2QMDeldujFfKqesK0uk88NbQlgj198J/p1IwY+UBOFdAX0yHezPztH0suSciIifGKeuIiMgeGNC7dKf7feV6eqVgX7w+qLm6PfuPw9hy9DwcKjdT63JflpL7jEQgK8X2x0ZERHQ1GXofltwTEZHtMKB36YB+T7l3cWOzyhjStprqqzd2wTasOxgPhzGPh/cNBfzDS97WJwjwj9RuM0tPREROKoUZeiIisgMG9K4oylxyvx8wln8M/KSbm6BedCDiUrNx98db1Bz15oyCXSUcvJid9/C48vaWxngM6ImIyDmxKR4REdkDA3pXJAGt3gfIywSSjpV7N/Il4/tHuuCeztrc7l9vOYE+7/ypprVzyPj5yCuMn7+sMR473RMRkXNiUzwiIrIHBvSuSKcHohpc1Th6swAfT0y+pSkW3n8NaoT743RyFkbO34JnvvsXKfbK1icevjglX2mYM/QsuSciIifFknsiIrIHBvQuX3Zf9k73RbmmTgSWP97Vkq1f9I+WrV+7Pw42l1ig5L40OHUdERG5SIY+2I8l90REZDsM6F2+MZ51Anrh761l6795oBNqRfjjTHIW7vnkbzz97U4kZ+Y6fsq6y6auK/9wAyIiInuMoQ9mhp6IiGyIAX0FnbquJB1qh+PXx7rh3i61VY+6b7eeVNn6NftskK3POA9kXigcqJe25D75JJCXbf1jIiIistoYemboiYjIdhjQu6qoRtrPhP2AQcsCWJOftx4Tb26Cbx/ohNqRATibkoVRn/6NJ7/ZieSMXOt3uA+uBnj7l+45AVGAVwAAE5AUa71jISIisnqXe2boiYjIdhjQu6rQmoCXP2DIsWlzuHa1wvHLo11x37Vatn7xtpPoPeMPrNp7zsod7ks5fl7IgXDqOiIicmKcto6IiOyBAb2r0umAqIZWH0dfXLb+hZua4LsHO6FOZADOpWRj9Gf/4NnF/yI9O89K4+fLENCLMK15H6euIyIiZ2MwmpCWf35khp6IiGyJAb07dLq3cUBv1rZmOH55rCvGdNWy9Qv/PoH+M9dhx4kk+3W4N+PUdURE5KTMwbxgQE9ERLbEgN4dGuNZaeq60vD10uP5/k3w1X0dUTnEF8cSMzB49gbMXHUQeQbjVcxBX8oO92bmBnosuScicgmzZs1CrVq14Ovri44dO2LLli3Fbpubm4spU6agbt26avuWLVti+fLlhbaZOnUq2rdvj6CgIERHR2PgwIHYv38/nKkhnrenDj6eekcfDhERuTEG9K7Mhp3ur6Rz3Ugsf6wbbmpRWZUWTl9xALd/tAknzmeUfidGY4GAvm7ZDsA8Fz0z9ERETm/RokUYN24cJk2ahG3btqkAvU+fPoiLK3r2lBdeeAEffvgh3nvvPezZswcPPvggbr31Vmzfvt2yzR9//IFHHnkEmzZtwooVK9RFgN69eyM9PR2OxinriIjIXhjQu0NAL2XreTl2f/kQfy+8N7w13hnWEkE+nvjn+AX0fXcdvtt6EiaT6co7SD4BGLIBvTcQWqOcJffHtQsDRETktKZPn44xY8Zg1KhRaNKkCebMmQN/f3/Mnz+/yO2/+OILPPfcc+jXrx/q1KmDhx56SN1+++23LdtIxv6ee+5B06ZN1QWCTz/9FLGxsdi6dSscLSVTy9AHsyEeERHZGAN6VxZcFfAJBox5wPn8TLedeXh44NbW1dTY+va1wtS4wae+3YmxC7YjKSOndA3xpHxeV8aSRJnmTuepXRBIPV3+N0BERDaVk5OjguxevXpZ1ul0OnV/48aNRT4nOztbldoX5Ofnh/Xr1xf7OsnJyepneHh4sftMSUkptNgKp6wjIiJ7YUDvyqQznaXT/R6HHkr1cH8svL8Tnu7TEJ46D/y86wxunLEOfx1KKP5JlnL7MjbEE3rPi1l9jqMnInJaCQkJMBgMqFSpUqH1cv/s2bNFPkfK8SWrf/DgQRiNRlVSv2TJEpw5c6bI7WWbxx9/HF26dEGzZs2K3EbG3IeEhFiW6tWrw1ZSs7UMPaesIyIiW2NA7+ocOI7+UnqdBx65rh6WPNxZTW93NiULd87bjFd/3oPsPEMJHe7LOH7+0nH0nLqOiMitvPvuu6hfvz4aNWoEb29vjB07VpXrS2a/KDKW/r///sPChQuL3eeECRNUFt+8nDhxwmbHzww9ERHZCwN6d5m6zo6d7q+kRbVQ/PTotbijo5ZBn7vuKAa8/xcOnEstZg76Mna4N+PUdURETi8yMhJ6vR7nzp0rtF7ux8TEFPmcqKgoLFu2TDW4O378OPbt24fAwEA1nv5SEuz/9NNPWLNmDapVq1bscfj4+CA4OLjQYisM6ImIyF4Y0Lu66EZ2nYu+tPy9PfHarc0xd0Q7hAd4Y9/ZVNz03np8+tfRiw3zLAF9OUruBaeuIyJyepJhb9u2LVatWlWoRF7ud+rUqcTnyjj6qlWrIi8vD4sXL8aAAQMsj8m5RIL5pUuXYvXq1ahdO/8irxNIyZ+2jiX3RERkawzoXV10k4tl57lZcDY3NKmE5Y93xXUNo5CTZ8TkH/fg3k//RsKFJCDpxNUF9Jy6jojIJciUdXPnzsVnn32GvXv3qq71kn2XMnoxYsQIVRJvtnnzZjVm/siRI1i3bh1uvPFGdRFg/Pjxhcrsv/zySyxYsEDNRS/j8WXJzMyEozFDT0RE9sIzjasLrAT4hgJZSUDCAaByCzib6CBfzL+nPT7bcAyv/boPa/bH45H3d2ERTIBvCBAQeXUl9+ePSapGaxJIREROZ9iwYYiPj8fEiRNV0N2qVSs17Zy5UZ5MN1dwfHxWVpaai14Ceim1lynrZCq70NBQyzazZ89WP3v06FHotT755BM1nZ1zBPTM0BMRkW0xoHd1EsRKlj52AxC/zykDevP0dvd0qY1r6kbgsa93IDR+C+ANnNJVRUSeEb5eZZy2ToTV0n5mJwOZFwD/oqcqIiIix5PyeFmKsnbt2kL3u3fvjj17Sp69xTJ8ywmlWkru+TWLiIhsiyX37sBJx9EXpVFMML4f2wVDa2olkZtTwzFw1l84eGnDvNLw8gOCKmu32emeiIicREqmFtAHM0NPREQVIaCfNWsWatWqpZrfdOzYEVu2bClx+2+//VZNZSPbN2/eHL/88kuhx6XUTjLCBRcZf+f2ne5dIKAXko3vVSlN3T7rWc3SMO+LTcfLnnGxTF3HcfREROQczCX3wczQExGRuwf0ixYtUs1yJk2ahG3btqFly5bo06cP4uLiitx+w4YNGD58OEaPHo3t27dj4MCBapH5ZwuSAP7MmTOW5euvv4bbz0XvRFPXXVF+h/s7+1+Pbg2ikJ1nxIvL/sOYz7fifHpO2Tvd5zfGi0vNwu+7z2Lj4USnLsckIiL3xTH0RERUYQL66dOnY8yYMarTbZMmTTBnzhz4+/tj/vz5RW7/7rvvqmD96aefRuPGjfHyyy+jTZs2eP/99y+bb1bmtzUvYWFhcPuA/sJxICcdrhTQh1RtjE/vaY8Xb2oCb70OK/eeQ58Zf2Ldwfgr7sJgNOGcp1Zyv2XbVnSbtgYdXl2F+7/YiuFzN6H3O39i4ZZYZOUabP52iIiIzDiGnoiIKkRAn5OTg61bt6JXr14XD0inU/c3btxY5HNkfcHthWT0L91eGuxER0ejYcOGanqcxMTEYo8jOzsbKSkphRaXIl3iA6KkRRAQvx9OL+M8kJH/+4ioC53OA6OvrY1lj3RBvehAxKdm4+6Pt+DVn/cgO+9iMJ6cmYu1++Mw/ff9uHPeJrSY/Bte2ZA/PdGFo4g9n6F6BDasFIRAH08cjEvDs0t2ocvrqzFj5QEkpGU76A0TEVFFIReb03O0cxcDeiIisjWHnmkSEhJgMBgs09aYyf19+/YV+RyZ7qao7WW9mWTwBw0ahNq1a+Pw4cN47rnn0LdvXxX06/WXd1OfOnUqXnrpJbi0qEZAerzW6b5qGzi1xMPaz+CqgHeAZXWTKsH4cey1ePWXPfhyUyzmrjuKDYcT0bxqCLbFXsCBc9q4+4Lifapoz/VNxBd3d0Cr6qGqxDElKxeLtpzAJ38dxenkLMxYeRAfrD2MQa2rqosH9SsF2e/9EhFRhZGWX24vWHJPRES25paXjm+//XbLbWma16JFC9StW1dl7Xv27HnZ9hMmTFDj+M0kQ1+9enW4XNn9sXVAXMnT/DhTub1k5y/l563HKwObo1v9KDyz+F/sPp2iFrPakQFoUyMMbWtqS72gTsCbzyEwJwFda/oD3l6WzsJjutXBqC618Ot/ZzFv3RHsPJmMhX+fUEuPhlG479o66FIvQjVNJCIisga5oCx8PHXw9nT4yEYiInJzDg3oIyMjVcb83LlzhdbLfRn3XhRZX5btRZ06ddRrHTp0qMiAXsbby+IW4+iPrAWyUwEfJ85AJx7UfkbUK3aT3k1j0LJ6qArEPfU6FcS3qRGKiMAifk++IUBWMnDhGFCpaaGH5Lk3t6yCm1pUxj/HL6j9/b7nHNbuj1dLo5gg3Ne1Dm5uWRk+npdXbxAREZUFG+IREZE9OfTSsbe3N9q2bYtVq1ZZ1hmNRnW/U6dORT5H1hfcXqxYsaLY7cXJkyfVGPrKlfPnLHdHda8HPH2Bs7uAj3trwa3TZ+jrl7hZpWBfPN+/CZ65sRFuaFKp6GC+lFPXSRa+fa1wfHh3O6x9qgdGdqoJPy+9mjLvqW934to31qix+Sv2nMPRhHTkGYzlf39ERISK3hCPU9YREZE9OPxsI6XuI0eORLt27dChQwfMmDED6enpquu9GDFiBKpWrarGuYvHHnsM3bt3x9tvv43+/ftj4cKF+Oeff/DRRx+px9PS0tR4+MGDB6usvYyhHz9+POrVq6ea57mtsFrAPb8AC+/Qyu4/ug4Y9gVQ61o47Rj6EjL0ZSJT153ZYZm67kpqRgTgpQHNMO6GhliwJRafbjiKcynZmLn60MWLTXqdKu+XJn11owPVz3pRgagTFQBfL2byiYioaCnmDL0fM/RERFQBAvphw4YhPj4eEydOVI3tWrVqheXLl1sa38XGxqrO92adO3fGggUL8MILL6hmd/Xr18eyZcvQrFkz9biU8P/777/47LPPkJSUhCpVqqB3795qejuXL6u/kmptgfvXaEH96e3A5wOAfm8B7bSLI07BaCwQ0F8+hr5cwq+coS9KiL8XHupRVzXJ+3nXaazZF49DcWk4kpCGrFwj9p9LVUtBMty+epi/FuBHB6qO+v1bVGaQT0RECjP0RERkTx4mk8lk11d0AdIULyQkBMnJyQgODobLyc0Evn8E+G+xdr/D/UCf1wC9E2QLkk4AM5oBOi/g+bOA3gpfeLZ9AfwwVht2cPfSq96d0WjCqaRMFdxblnjtp0ydd6kHutXBhH75PQyIiGzE5c9NFeTz/GzDMUz6YTf6NY/BB3e2tdp+iYjI/aWU49zEy8fuyMsPGPwxEN0EWP0ysOUjbX76oZ8C/uHOMX5esurWCObN+ypHhr44Op0Hqof7q+W6RtGW9XLtKyEtxxLgbzt+AUu3n8J3W0/iqT4N4aVnN2MioorOnKEP8nGCi+hEROT2GIG4K6kN7/YUMOwrwCsAOPoHMK+nFtg7RUM8K42fL9gUL/kEYLg8g24t0lgvKsgHnepG4O5rauLNIS0QGeiDxPQcrNkXZ7PXJSIiV+xyz5wJERHZHgN6d9f4JmD070BIDeD8EWBeL+DA7+4V0AdVBvQ+gDFPC+rtRKbEG9Smqrr97daTdntdIiJygaZ4nLaOiIjsgAF9RRDTTGuWV6MzkJ0CLLgN+Gum1JC7R0AvTROtXHZfWkPbVlM/JUOfkJZt19cmIiInLrlnhp6IiOyAAX1FERAJjPgeaDNCRoMDK14Elj0M5Nk5CE04aP2AvmDZfSmnrrvM6R3An28BB34D0hNL/bT6lYLQsnoo8owmLNt+qnyvTUREboMl90REZE8821Qknt7AzTOBSs2A5ROAnQu0jPmwL4EgbZpAm5KLB0mx2u3I+tbd99Vk6FNOA18MBDIvFL5AUK0dUK09ULUdENNc+/yKydLvPJGEb/85qabAk7H2RERU0TP0LLknIiLbY0Bf0Uiw2fEBLaD+9h7g5BZgdmeg29PafPWePrZ7bRVsmwCfYCAgykYZ+mNle57RACy5XwvmQ2sAnr5AwgEt0y/Lrm+17fTeQOWWWnCvAv12QGhN9Xne3LIKXv5pj5qzftepZLSoFmrd90ZERC6XoQ/241csIiKyPZ5tKiqZs/2+1cCiO4H4fcDyZ4AN7wE9ngFa3mG9KeUKSjSX29fVLiw4Q4Z+/XTg2DptJoC7l2nHJsH9qW3Aqa3Ayb+Bk/8Amefzb/8NbM5/rn8kULMTQvq8hj5NY/DDztMqS8+Anoio4krJz9AHM0NPRER2wIC+IousBzy4Htj+JfDHNCDlJPDD/4D1M4DrngOaDtIazlm9IZ6Vy+0vHUMvzf5Kc8HgxBZgzVTtdv+3tWBe+IUB9Xpqi5D9yX4lsJfl1D/AmX+BjARg749AZhKGdvlEBfTf7ziF5/s3hq+X3vrvkYiInB7H0BMRkT2xKV5Fp/fSSu0f3Qb0fhXwjwDOHwYWjwY+7Ars/9V63fBt0eHeTMrlPXRAbgaQdu7K22cmAd+NBkwGoPlQoOXtxW8rFwfC6wAtbgP6TQPGrAYmnARG/qiV4h9bh866PagS4qumK1qxpxSvT0REbifPYERGjkHd5hh6IiKyBwb0pPHyAzqPBR7bCVz3vDbO/dx/wNe3Ax/fABz54+pfI8Ec0Odnwq1JGtaFVCtd2b1coPjpCSA5VhsH33962YcAePkCtbsBbUaqu/q1r2Fw/pz033FOeiKiCiktW8vOC2boiYjIHhjQU2E+QUD38Vpg3+VxwNNPGzf++S3AZ7doJedXm6G3dof7sk5dJ0MMdi8BdJ7AkPmAb3D5X7Prk1ojvRObcGfkYbVq3cF4nE3OKv8+iYjIpcvtfb108NLzKxYREdkezzZUNP9w4IaXgMd2AB3uB3RewNE/gHk9ga+Ha03jDFrjn1KRRnMy5lyE2yBDX9rGePEHgF/Ha7evf0HrVn81gisD7UarmzFb30KHmmEwmoDF25ilJyKqqA3xWG5PRET2woCeShYUA/R7E/jfVqDVXdo49f2/AHOvA16NAWa2Br4cAvwyHtj8IXBwJZB4GDBcLDtUZJ3aX2XAJ9AxGfq8bGDxvdo4+zo9gM6PWed1r30C8PIHTm/D/2octpTdm6zVe4CIiFwCG+IREZG98YxDpRNWExg4C+jyGLB2qhbU52UB549oy6WknF3Gp0szORkzn5Vsu4Z4pc3Qr5wMnN2lNf679UPrdfAPjNKqGP6agc6xHyLA+zkcTUjH1uMX0K5WuHVeg4iIXCigZ4aeiIjsgwE9lU1UA2DoJ4DRCKSe0TriS/bdHNjLbcmQq2Bf1h8GDq24+HxbBvTmDH1RFxgO/AZs+kC7PXC2VnlgTXKh4++PoT+3C+NrHsSkg/XUnPQM6ImIKo5Uyxz0/HpFRET2wTMOlY9kt0Oqaot0ey9IBfunCwT6EvQfAbJTtCnybJ2hzzyvVQT4hmj3U88Cyx7Sbnd8CGjQxzY9B655CPhzGoamfomXMBE//Xsak25pAn9v/m9GRFQRpGSaA3pm6ImuhsFgQG5uGXo1EbkILy8v6PV6q+6TkQbZKNivpi11utu3Q39AFJAer5XdV2mlXVxY+gCQkQjENNca/dlKp0eALR/CP+kA7gnZhvnJ7fDrrrMY3DZ/Oj0iInJrHENPdHWk/9DZs2eRlJTk6EMhspnQ0FDExMTAo6zTZheDZxxyL1J2LwH9hfyAfsNM4MharWnd4PmAp4/tXtsvFOj0P2DNK/if7jt8htb4dusJBvRERBVEav489AzoicrHHMxHR0fD39/fagEPkbNcsMrIyEBcXJy6X7lyZavsl2ccci9Sdn9yi5ahP7kVWP2ytr7vG9r4f1u75kE1Vj8sMxYD9X9h8ZFuiE3MQI0If9u/NhEROcUYejbFIypfmb05mI+IiHD04RDZhJ+fn/opQb38rVuj/J7T1pF7MTfGO/uvNkWdMQ9oeivQ+m77lf1LgzwA432/hyfy8B3npCciqhBSWHJPVG7mMfOSmSdyZ/75f+PW6hPBgJ7ci7kx3u6lwIVjQEgN4KYZgD1LtjqMUWP5KxnOYIj+TyzeehJGI+ekJyJyd5y2jujqscye3J2Hlf/GGdCTe5F578089MDgedrYdnvyDgCuHaduPua1FPFJKdh0JNG+x0BERA4suWeGnoiI7IMBPblnyb3oMQGo0dExx9HuXiCoMiojEcP0a/DtVpbdExG5O3a5JyJrqVWrFmbMmOHowyAXwICe3EtgFNDlcaDDA0BXLUvuEF6+QNcn1c2xnsuw+r/jSMnP3BARkXtn6DkPPVHFKp8uaZk8eXK59vv333/j/vvvt8oxfv3116r52iOPPGKV/ZFzYUBP7kfmmu83DdBdfdfIq9JmBEwh1VDJIwlDjL/j53/PwC2ZTMC/3wBx+xx9JERETpGhZ0BPVHGcOXPGskhGPTg4uNC6p556qtC0ZXl52r8TVxIVFWW1BoEff/wxxo8frwL7rKwsOFJOTo5DX98dMaAnshVPH3h0G69uPuj5A374+yDc0t/zgCVjgI97A+f2OPpoiIgcItdgREaOQd1myT2RFeftzslzyCKvXRoxMTGWJSQkRGXlzff37duHoKAg/Prrr2jbti18fHywfv16HD58GAMGDEClSpUQGBiI9u3bY+XKlSWW3Mt+582bh1tvvVUF+vXr18cPP/xwxeM7evQoNmzYgGeffRYNGjTAkiVLLttm/vz5aNq0qTo+mRt97NixlsdkKsEHHnhAHauvry+aNWuGn376ST0m1QetWrUqtC85Zjl2s3vuuQcDBw7Eq6++iipVqqBhw4Zq/RdffIF27dqpz0c+qzvuuMMyP7vZ7t27cdNNN6mLJLJd165d1Wf3559/wsvLC2fPni20/eOPP662qWh4xiGypVZ3wPDn24hKPo6Wp7/BobiOqBcdCLeRFg+sflm7nZ0MfDUEGP07EFLN0UdGRGRXafnZeRHIgJ7IKjJzDWgy8TeHvPaeKX3g722d/5clmH7rrbdQp04dhIWF4cSJE+jXr58KciWI/vzzz3HzzTdj//79qFGjRrH7eemllzBt2jS8+eabeO+993DnnXfi+PHjCA8PL/Y5n3zyCfr3768uNtx1110qWy/Bs9ns2bMxbtw4vP766+jbty+Sk5Px119/qceMRqNal5qaii+//BJ169bFnj17yjx3+qpVq1RQvmLFCss6mbLt5ZdfVgG+BPJyDBL8//LLL+rxU6dOoVu3bujRowdWr16tni/HJRUOsl4+S7ko8PTTT1v299VXX6nPp6LhGYfIlvRe0F83AVj2IB7w/AmfbB6DcTe3g9tYOQnISgYqNQcMOUDCfuDLIcC9y+0/uwARkROU2/t56eGlZwEkEV00ZcoU3HDDDZb7EoC3bNnScl8C26VLl6qMe8Hs+KUk4B0+fLi6/dprr2HmzJnYsmULbrzxxiK3l4D8008/VcG/uP322/Hkk0+qrH3t2loj6VdeeUWte+yxxyzPk4oBIVUDsv+9e/eq7L6QQLqsAgICVHWBt7e3Zd29995ruS37lPcir5uWlqaqFmbNmqUuQixcuFBl44X5GMTo0aPVxYqn8wP6H3/8UQ0nuO2221DRMKAnsrUWtyFt1RsISz0K/+1zkdevDTzd4cte7CZgx1fa7ZveAYJigI9vAOL3AgvvAO5aojUHJCKqAMyNT1luT2Q9coFMMuWOem1rkdLygiRolXL1n3/+WY2zl6xzZmYmYmNjS9xPixYtCgXJkrW+tEy9IMmIp6enq2oAERkZqS4sSIm9XESQ554+fRo9e/Ys8vk7duxAtWrVCgXS5dG8efNCwbzYunWr+gx27tyJCxcuqIsPQj6DJk2aqNeW8nlzMF/UxY0XXngBmzZtwjXXXKMuXEgwL59LReMGUQWRk9Pp4dvreXXzDsMP2Lj7MFyeIQ/4Wevij9Z3A9XbA6HVgTu/A3yCgeN/AUvvl0vDjj5SIiK74JR1RNYn48al7N0Ri7y2tVwaZEqjPMnIS5Z93bp1KniVoPdKDeMuDW7lGM2BcFGkvP78+fPw8/ODp6enWqSk/bPPPlPPk/UludLjOp3usl4DUvp+pfcvFxn69OmjLkhImbx09JfPQ5g/gyu9dnR0tBqm8Mknn+DcuXOqT0HBrH9FwoCeyA48mw/GOd86CPbIQOraGe7RCO/cf4BvKNDrpYvrY5oBw74EdF7Anu+B3yZoXfCJiCrIlHVB7HBPRFcgY8ElwywN7iSQl6Zwx44ds+prJCYm4vvvv1cl63LBwLxs375dZcR///131WhOGtjJGPfiKgJOnjyJAwcOFNuJXxrTFQzq5TWuRJoFyvHJuH3Jwjdq1OiySgN5bbnYUdQFArP77rsPixYtwkcffaTG93fp0gUVEQN6InvQ6ZDd9Rl1s1vid0iKt/0UdscS0rF2fxz2nkmxlIJaRepZYM2r2u1ek4CAiMKP1+kO3DpHu715DrBhpvVem4jISTFDT0SlJR3qpdu8BL9Sci5N6krKtJeHNIyLiIhQZejSmd68yNh9KcGX7L2Qsve3335bjWE/ePAgtm3bZhlz3717d9WAbvDgwap8X8beSyZ8+fLl6nFpWBcfH68a0Un3eRn3Lo9fiTT+kxJ8eZ0jR46o3gEyBKAg6SWQkpKixv3/888/6tjkPUnjQDNzlv+VV17BqFGjUFHxrENkJzU6D8Oh1dNQz3AYe795Ar73fATfgGCr7T8r14BNRxKxdn+8CuSPJWYUely+ZFYN9UO1MD/1s6r66Z//0w+Rgd5FlpcZjSakZuchJTMXSRm5qLTyaURnpyAhpBm+SemCpF/2qsxUtTB/XFMnHM2rhsK7+RAt8P/9eWDFRCAwBmg5zGrvlYjIWTP0wX7M0BNRyaZPn67Kwzt37qzGtT/zzDMqeLUmGScvFQBFfbeTAP3uu+9GQkICRo4cqZrJvfPOO2oogBzPkCFDLNsuXrxYrZdmfFIqX69ePZVZF40bN8YHH3yghg5IQC77lW0lY14SyezLmPfnnntOXUho06aNmgXglltusWwjFyOku700vZMLC9JZX6bIK5iFl5L/e+65R73+iBEjUFF5mEo7yWIFIv9DSVdFmbZBrvoQWcvv33+B3tu17qVnTOH4Mmg0UuoOQKsaYWhVIxS1IwKg05V+zFZsYgbWHojDmn1x2HgkEVm5F6/ueuk9UDsyAHGp2SoQvxIfT50K7KODfZCZY0CyBPCZuSqQN+b/K9HRYy8W+bwMo8kDA3Jexi5TnSKbyLStGaaC+yEJsxGz52NA5wnc+S1Q93rYU0JaNrYdv4DD8eloGBOI9rXCWQ5LLovnJuf+PN9bdRBvrziA4R2qY+qgi42riKh0JKg0d1+X+c6JSmP06NGqSkCy/O7wt16ecxMz9ER21OXG4Zh77gL6n56JKh7xeDrtTfy9/Xu8tGUE/jPVQbCvJ1pWD0Xr6qEqwG9VPQzhAd6FsvBbjp7XsvAH4nAkPr3Q/iuH+KJHwyj0aBiNLvUiEeij/S+enp2H00mZOJmUiVMXMnHqkp/nUrOQnWfEkYR0tRQlyMuE1zw/BUzAyoB+qFy3Exr5eSHU3wsBPp7YfzYVm4+ex/n0HKw/lKCWt3Ed3vfeg/7YiJwFd+JA329Qv1Vn+HiWs3Os0aD91F3+/DyDEfvOpmJb7AUVxG+LTULs+cJVCnqdB5pVDUGnOhHoVDcC7WuFFT3H7Nn/tGEFIdWAtvcAlZqWeFiJadnqtWWR30G/5pXL9/6IyA263POiIRGRrUnAu2vXLixYsMClgnlbYEBPZEcS+I65/1GYcu5D8up3EPD3e2iPA/jB50UsNvbAG1m3Yd3BPKw7mGB5To1wf7SqHqqC8g2HE5GZa7j4P7DOQ2XDr2sUrQL5hpWCtNKqtHhg5yda2XuXRxHgG4L6lYLUUpScPCPOJmepAD8uNQsB3p4qUA/x80JI/k+fLR8Av58A/CPQe+z76O0fXmR5/sG4NGw+mqjK/zcfOY8n0h9EmFcyOmMPon+8C/2WTUGlmg3RsXYEGlcOUuWpMhwg2Ff7KRchCk3rJ2PKTmwGdi/RGu1lnAeueQiJ7R7HtrN5lgD+35PJhT4bIR9F/ehA1I8Own+nk3E8MQM7TySpZc4fh9XnJ5+tBPcS5LepFgDfTe8Cf74FGPOrGrZ8BFTrALQbheyGN+PwBRP2nU1Rwbv0J5Cf8anZhV73hf6NcV/Xss/TSkRuMIY+/0IqERHZzoABA7BlyxY8+OCDaiq+iowl90VgWSPZTfIpYOVkYNc36q7BKwjb69yPb3T9sPVkmioVv1R0kA+ua6gF8F3qR6pAWJFAd++PWuB79E/AlF9+H9kQuGMhEH4VAWbKaeD99kBOGnDL+0Cbu0v1NPnn5VBcGrbuP4au60egas4RHDZWxpCcSbiA4v/f8vPSoZP3UfTTbUAPwwZEGhMv2+aUKQJTckfgN6PM7aoNU5ALAq1rhKFNjVC0yR/GYPl8AFWlsPFwohqeID/lAoZZE49jeNv7QzT2OK7un6/WC3keekScXAW9SfuinmwKwBLDtVhg6ImDpmqFLhzUDPdHpWBfVaUgXh7QFHd3qlWqz4moNHhucu7P85GvtuHnXWcw+eYmuKdLbascI1FFwpJ7qiiyrFxyz4C+CPzSRHYXuxlY/gxwert2P7wucONUJFe/Hv+e1DLKep0O3RtEqay2pcFJVjKw72fgvyXAkTWAUQs8lSptgNQz2uIXrk0nV6uc03l8O0q7UCCZ6nt/U137yyzlNEzzboBHyknEh7TAa1Fv4EiySTWSksxWalYOGuQdQn/9JvTXb0Y1j4tVCikmP6wwtsOPhmvgCSMmeX6O6rp49djeoE443O5FNGzUAnWjAkvdg0D+6TtxPhObD51B8JYZ6Jn4FTxhwHlTICbl3oMfjZ3UhYIoJGGofi2G69dYXlMcD2iB0/Vuh1/LQahfNUpVX8g+3/xtPz5Ye1htM21wC9zWvnrZPyuiIvDc5Nyf590fb1bVVW8PbYnBbS9e8COi0mFATxVFFsfQE7mhGh2B+1YDOxcAK18Czh8GFtyGkHo3oGuf19C1foOL22anAQeWa0H8oRWAIefiY5WaA81uBZoOAsJrAylngIXDtQsFnw8Abnqn1Nl1iyNrtWDeQwf0f7t8wbwIrgKPuxYD8/sgKvlfvBPzHvDgF0DcbmD3Um25cHEOVoNXAM5X7YkTVW/EsZBOSM31QNv8ktajMSMRdfJT+G5+D41TN6LxukEAngIiHgV0PqU6HLkoUiN7P2psfQRI3K3WpdXtjzU1n4LpJFD5+AVV/t+ochUExHTEwZgp8M/ejv+3dydwNtX9H8A/szObwRgMIdmJComSsiZJ0qIVeXhs/VUPFWVrI0p7Sgv11ENRtFHZK5Et+xI9IY8ZYzeL2c//9fkd986dMcMMs917P+/X67j33Hvn3HN/97i/8/0t31Nh56fw2bUQNRM3o+amzcCuycAV95q59j6V6mNkl/omOeGHK//CE19uRlCAL3pcUe3CykxE3IYuWyciIiVBPfS5UC+IlKjkU8DPLwGr3rbncTNDfKtBQPWWdtD7xw9AetZQcTOkvkkvoMntQGTds7eXmgR8NcT+W2rzMNBxQq6J5c6SngpMawMc3Q1c/U/g5skX//n2rbIbFzJSzHx8JLkMpw8IBup1sRsk6nYCAsqee1uH/wAW/MueYkAV69iNDrVvOM/nSgFWvAj88ipgZQDBkUC3l4DGPfP3GdhQ8vsnwIaPgJN/Zz1eo42Z3281uAVPf7UNn/623yTie/OeK9FVifLkIqluKt3l2eHl5Waa1KwB15i8HCJSMOqhF2+RrB56EQ9XJhzo9AxwVR/gh6eAPxYCq97M/pryl2YF8VGN7EnceQkMBu6YYQf+KyYBv74BHNkN9HofCMo9SZ4T35fBfEgUcOPowvl8NVvb7/35g3Yw71/GDt4ZxDOYDwzJ/7Yq1QMe/BrYMhf4YTRwdI/dWNDkDqDL80BYlbP/5n/rgflDgMM77XW+781TgJDI/L9veFWg3Uig7WPAniXA+hn2qIn9v5rFp343PNttqrlywNz1B/B/s3/HuwG+aN+gcv7fQ0TcinroRUSkJKjWESmtKl5mJ7PbsxhY+pw9X77BLXYQX/WKcwfxOfG1N46ye/C/GmoHnx90Bu6ZDZSvmfvfnPgb+GmKfb/zs0DZCBSaRrcCfb8FEg8DdTqev2HhfJ+t6Z1Avc7A0ueBte8BW+cCu38E2j8NtOgP+PkDacnA8onAr6/bCQNDKgHdptr7cqE4yoHvy4UJDte+bzeY7PoOvvtWYnLXyUhJq4tvNsdg0Ccb8GGflriubgEaDkTE7QJ610ScIiIiRU1D7nOhYY3i0Q6st+fVJxyyh5r3/hSocc3Zr/vsfjtrPoeR91tQsAaEksR8Ad8+BhzcYK9XaQpcMwT4ZSpw5A/7scvvArq+CORy6b2LxmvYc4pDzCazmlnvZjyR0g9zdqWhTIAvPup3NVrV1nBcKTjVTaW3PNMyMlH3qYXm/saxnRARHFhIeyniPTTkXrxFciEPub/A7FYi4raqNwcGLLMD3aQjwEfdgU2zs79m92I7mPfxs+eWu0swT9FXAv9YbPe+lykHxG4G5g+yg/nQykDvWUCv94ommKcqTYB/LAFufBrwDYDvHwsw+dAAjKq2GclpGXho5lps2H8cHuv0cWDrF8DPU+18D/GHSnqPRIqtd56YTFNEpKBuuOEGPPLII871WrVq4dVXXz1vgt/58+df9HsX1nakZKjWEfFG5aoBD30PzPunHbjz9vAuoP0YO2v+wpH2664ZDFRuDLfDofAt+wMNbwUWjQG2zAEuvxPo8kLRBfKu/ALsOfb1u5reep+YTfhn8iQ0j2iNwSfuR58P15jEWU2qlYPby8wEYjbauQR41YUDa+0pDa7Cou2Glugr7FtOGQmtVFJ7LFLoePlNCg70g7+f+kpEvEn37t2RlpaG77///qznfv75Z1x//fXYtGkTmjZtWqDtrl27FiEhBcgrlA/jx483gfvGjRuzPR4TE4Py5cujOJw+fRrVqlWDr68v/ve//yEoKH9XJ5K8KaAX8VZMPnfnx8Cy54CfX84aks559sf+C4RWAdo9AbfGoLHnO8Ctb9hBdnFz9NYzm/6KF9EieRWWld2Cp1IexP3vA7P/2RoNqrjh0OmkY8CfS4Hdi4A/l9i5EFxVaghENQTidgBHdgHxB4FdXL7Lek149awAn7dVrwRCNBVB3JMS4ol4r/79+6NXr144cOAAqlevnu25GTNmoEWLFgUO5qlSpeJr+K5SJZckwkXkiy++QOPGjcFZ32xcuPvuu1FSLMtCRkYG/P3d+7dbzcgi3ozXlO8wFug5HfALBHZ+C/zyiv0cs8Qz474nKIlgPmdv/cDlQNVmCLUS8Frg25iS/iKGv/c99sQlFN++ZKTZl+xjr3pB8PXMvbB8EvB+R2DKZcAX/YHNs+1gPjDUTth4y6vAI1uBoauBO2fYt0/+DfT7HugyEWh6NxBZj4P7gFMH7ONt6bPAJ72AKbWBqY2Bt9sA77YD3u8EzLwF+HdP4D932zkd5vYH5g0Gvv4/YMFI+yoQi8fbyRt/mw5snAXs/M6+jOHBjcDRP4HEI/blF4sSU9GkJNiJEQ9tB/avtqcbbJ4DrHkP2LuyaN/fTbz11ltmCCnnC7Zq1Qpr1qzJ87Xs7XrmmWdw2WWXmdc3a9Ys196vgmyzKJ0600MfpoR4IoX/+5qaWDJLPtOM3XLLLSb4njlzZrbHExISMGfOHBPwHz16FPfcc4/pmQ4ODsbll1+OWbNmnXO7OYfc79692/T28/euUaNGWLRo0Vl/88QTT6BevXrmPWrXro0xY8aY31Pi/k2YMMGMFuAQey6Ofc455H7Lli1o3749ypYti4oVK2LgwIHm8zj07dsXt912G1566SVUrVrVvGbo0KHO9zqXDz74APfff79ZeD+nbdu2mTLl/PGwsDC0bdsWf/75p/P5Dz/80DQIsGef7z1s2DDz+N69e83ncB19cOLECfPY8uXLzTpvub5w4UI0b97cbOOXX34x2+/RowcqV66M0NBQtGzZEosXL862XykpKaZ8L7nkEvN3derUMfvPRgHeZ1m44n7wvfbs2YOi5t7NESJSOJrdDVS4FJh9rx2g1WprXxZPiqS33lrxIjphPVqmP4Kp725F/8GPo2Zk6IVvmwE3LwHInvD4WODUmVvneox9n69x8PU3c/xNQw4bHRxLzse4zksXuv4tRTUG6nYE6nQCLmkF+OeRBCwo1L5UIReHlHggZrOdwJALh+zzkoMM8rkUBb8gZAaFI80/BMm+IUj3K4MAf38EBAQgMMAffrwSAnNGmHLxPXPfL/stpxKknLKvOOFYzPopwMrI+72vHgjUuhbe7LPPPsNjjz2Gd955xwTePEnt0qULdu3ahaioqLNe//TTT+OTTz7Be++9hwYNGuCHH35Az5498euvv+LKK6+8oG0WJfXQixSRtCTgheiSee/RB/N1KV327j744IMmOH7qqadMEEcM5tn7y0CewTADSAaEDFS/++47PPDAA6bR8uqrrz7ve2RmZuL22283Aedvv/1mEqa5zrd3YADM/YiOjjZB+YABA8xjjz/+uOkJ37p1q2kcdQSrTL6WU2Jiovktbd26tRn2HxcXh3/84x8mcHZttFi2bJkJqHnLoJXbv+KKK8x75oWB86pVq/Dll1+aQPjRRx/Fvn37ULOmfcUlDsFnowXzCSxdutSU1cqVK5Gebv/GTps2zfzuT5o0CV27djXlsHJlwRvNn3zySROAs9GDUw3+/vtv3HzzzXj++edNsP7xxx+bqRSsT2rUqGH+ht8x9/311183jcxManfkyBHzfT/00ENmNMaIESOc78F1fhYG+0VNWe5zoUzC4rVOHgC2zQOa3VOw67JLwcRuRfq8wfA/tNmsrvNpjPSQaJMFv4w/Fx8EBfjZt/6+ZvEz5wdnfq75s52ZDiTEAfEM1mOBzPO3il+MJJ9gbC97FXaFXYO9EdcgLSQaIUF+CA70N/OGQ3hr1u3HuM+Z1pnhbJkWMizL7DbvZ1pnlkyYxzMzLfimxiPk1G6E+qQh2D8TIX4ZKMvFNwNBPunw5edzjDDgLXM9ZKTYve+pCaaRwEo5hfSkk2ZhoO2XmoDAzCQUGzYGMBEjl6DwM/fD7UszNu970Zt357qJATd7PN58803nySl7OR5++GFzYpUTT0Z5YsweHwcOaWVvEQP9C9lmUZbn3PUHMGLOJlxfrxI+fuj8J+ciks/M3+wpL+UBPe3cuRMNGzY0wS2DUWIwx0D13//+d65/w15oNlg6enb5dwyIHb3y7KFn0M7lxx9/RLdu3Uzwy99HYmDOoHbevHmmtzw33Pbs2bOxbt26c86hZ1Dq2A4bUtnwwCDXMYd/wYIFJsA9ePCgaVRgDz17uxmg+/n5mdfcddddZl483y8v/F3fvn27eS/i+/Ezc79MkY8ebf6egTQb3HPiCId+/frhueeeO+u5vXv3mmPn999/N9t09NAzYHd8L9znG2+80ZQBe+TPpUmTJhg0aJBpyPjjjz9Qv359MyqiY8eOZ72W5cLAn43ObKDhSAV+Tyz/Pn36FHmWezUli0iWctWBNg+X9F54vipN4D9wKRKWTkHQypfRwtoGJGy7qE1mwgdHrXAcssoj1iqPQ1YF+z7KI848xvUIpMMf/khHADIQ6JOedR+O++kI8Mmwb888x+3+btVB+ml/4BiAfRzCvhdF4+wKnJ0dzBzO63uzB9Re7Pt8/FhiKvYeTcL+o4lITM3eU+6LTITiNMKQhFCf04guk4raYZkI9k1D4ukUnDqdgoz0dPj5ZJrX+p1ZHPezHrMbU9ICwoCy5eBfthwCQiugTGgEQspVRFhERVQIL4dK4WUQGRqEiqGBCFByNCM1NRXr16/HqFGjnI/xpI8nReztyA2HNuY8yWEwz6GRF7NNLq4nTYWdFE899CKFLCDYDqxL6r3ziYF5mzZtzHBwBo7ssWZCPE4dIvbUv/DCC/j8889NLzR/w/h7xKHx+bFjxw7TYOkI5ok96Dlx5BJ7kBloc1QAe7YL2mDJ92IPtGtCvmuvvdY0mjLQZkBPHPbuCOaJvfUcFZAXlsFHH32E1157zfkYh92zV3vs2LHmN5wNDRxin1swz5ECDJw7dOiAi9WiRYts6ywrNipw5AQTBLLcmLxv//795nnuFz9ru3btct0evxc2uPD7Z0D/zTffmO/3zjvvRHFQzSMiUhL8AhDaaTSSGvXAnt++RmJKKhJSMpCQnG7fpp65n5qB9DNT3i34OProTah5xCp3JoCvgMMoZ0JyP18fVAwJNEFlpbAgc9sgLAjXhQaa9SB/PxMgs8PfzKE7EzDbj9lP5HyO19hOSs1AUkoGElPT7fup6UhMOXObmoHTqRlITLGf42tS0jLNyHU/Hx/4+vrA18fH5T7MfvIx1/vEv+XwZXtJQ1qG3bPveOx8uJmq4WVQo2IwalYIQc3IM7cVg81jbBRwxREE8SnpiDuVjEOnUnDI9Tbevh97Mhlx8clmX8D2gmQA2a48eOzMkl354ABT5rc2i8aw9nXhrTgkkSdyjpNAB66zVys3HO45depU08PFIalLliwxQzS5nQvd5sSJE8380aLgODbDFdCLFC7+qOezl7ykca48RwgxtweHW/O3yxEATpkyxQSy7H3n/HkGy+x5Z2BfWNiYed9995nfOf6GspeXvd0vv/wyikLOoJvnDQz688KpU2zMyJkEj7/l/I3v1KmTabjNy7meIzYIkOvg87zm9Oe8egAbFdj7zh51DpHne91xxx3O7+d8702clsBpFK+88or5/vk589tgc7FKRc3DA58HemxsrGkReuONN845n4RzUpjkgUMr6tatixdffNHMe3DgFzlu3DgzZIRDLdiqxDkXfK2ISGkSXK0xGt6e96UB+Xt28nQaDsen2EuCfXsiKQ01ywYgMiwQlULLnLkNQvngQBM0ewJ+9pT0TJNwzDXI5+2p02ceS0lHRNkAE7DXrBiC6uXLokxAVo/B+fAEhEE+lzpRYefcl+NJaTiSkIIjLt/DkYTUM7eO9RQcTUw1Uwv4ei5cl4LhiS/nYbLXi98RT4w5zJK9HxeKvfmce+naQ88er8Lsoc/ZYCQi3oNDzocPH47//Oc/Zg724MGDnfPpOc+bQ7zZI00MfDmMm8nt8oPD+TkEnr3H7Amn1atXZ3sNh3tziD+HtTtwiL6rwMBAZ8Poud6Lc+U5l94R+HL/GTBz2PmFYgK53r17Z9s/4rx1PseAnlcDYC8+A/GcDQbMBcBpCAz+OWw+r6sCxMTEOHOt5JxakBd+Pk4jYK4WR48940wHNsLwO1uxYkWuQ+6JsSjLizEnp0P89NNPKC4lHtAXNKkND1Yml2BLO+ee8D8N519s2LDBzHWgyZMnm+EmPCA4N4HBP7fJORs5h/CJiJRmPBmICA40S93KeQecnvrZGZxzOUesXWz7UiEk0Cz1zvM9MCfA8aRUZ7AfFe7d19iNjIw0QxUPHTqU7XGu53WpJJ6YcY4j5xkyOzSHM3JePBMYXeg2meioqK53/GDrWmhXLwpVyukcQ8RbMTs6e2XZeMgGQwaIDuxUnDt3roljOKebI5D4e5XfgJ5BJLPXcz42O0G5/ZyBMd+DQ8TZK8/8Ihw+7pir7sCAmHO3GejyEnsMknP+LrKXnx2jfC8OQz98+LAZecDe55yjovKL2+Aw9K+//toZrzkw2RwD6WPHjpn56uzYZeDPcuQoAzZcsKOXjQncH85rZ4zI/AHx8fEmGOf+sRf9mmuuMQnzGP9xiD4TrOYHy46jwJgngPU9Y0fX0QYsN5YHk985kuKxsYTvwYYcYp3E75z7ze3lNiWiqJT4BD8e0GyFZ8s7D2oG9hyekFcrPFvtb7rpJowcOdK0ID377LO46qqrnElx2IvCRgF+gWwJY0sPW8k458L1cgwiIiJFgSMkKoYGoX6VMFxXN/K8DQCejj1CzO7MXhUHnihx/XwnPGyEZxIkzmfktYsdSYwuZptF4ZIKwea7rhN1EVerEBG3x2H3x48fNx2JrvPdGZcwXuHjnGPPhse8Etnlhr3jDM45r5vBLYd3s2fb1a233mqyxjMoZlI4Nh4wMHXF5KKMo9jDzYbT3C6dxziMw+MZYLNhgEPPOW/dEWtdCMZi7L3Obf47H3MkPOXl75jdnj3knK7A33mOuHb01jOoZpz39ttvmzn87NzdvXu3c1uMH1lf8O84pSG35Hl5xaNsaGEeBAb1/J74fblizzvLYsiQIWb0GONXjmLI+f1zmD7j2uJUolnu+YF50LDFyvWg5pfFofJfffXVWX/DDILs0Xe9VANbkRis87qK//3vf83QPNcMh8SDguuuiRjOlSiHw/DcMZOwiIh4JnfOcs/ReKzb3333XXMyyhMyJofifHf2+LCHhoE7R98RL8vEuZast3nLXhn2KnE0XkRERL626cnlKeKJzpX5W8Qd/Pzzz6aBgtMjzlUPeVSW+wtJasN59rm9no87nnc8ltdrijNRjoiIiLfjMFQOuWQmY9bFDNQ5x9BRV3OYqCOhkeNkhz1abKTnMFbOTeSlnxzBfH62KSIiUhzYMcz6iI3PzGxf3PVQic+hLw2KMlGOiIiIwAwD5ZIbXhvYFUfVMe/NxWxTRESkOHDqAofbs2GZ0wuKW4nOob+QpDZ8/Fyvd9wWNFEOhzS4LiIiIiIiIiLnwmR4HHW+fv16M33MqwL6C0lqw8ddX0+8bqDj9ZyLwMDd9TXsced8vJJIlCMiIiIiIiLikUPuOdSdSW1atGjhTGrDjIGO7IA5E+Xw+o4civfyyy+jW7du5tIM69atw/Tp083zvNSAI6shLxnguGwdM00WJJukiIiIiIgUrxLM1y3ilse4v7slyuHlBHjteSbLGT16tAnameHe9ZqGjz/+uGkUGDhwoMmWf91115ltKmOmiIiIiEjp47g0WVJSkrmMmYinSkpKynbMu/Vl60orXcpGRERKG9VNhUvlKVL6xMTEmM64qKgoc2lrjrwV8RSWZZlgPi4uzly1pWrVqme9xu0uWyciIiIiIkKOBNYMeEQ8VURERJ7J2i+EAnoRERERESlx7JFnryV76NPS0kp6d0QKHYfZ8ypvhUkBvYiIiIiIlBoMeAo76BHxVCV62ToRERERERERuTAK6EVERERERETckAJ6ERERERERETekOfS5cFzJj5cNEBERKQ0cdZKuNls4VNeLiIgn1PUK6HMRHx9vbi+55JKS3hUREZGz6iheo1Yujup6ERHxhLrex1JT/1kyMzNx8OBBhIWFmctnXGwrC08W/v77b4SHh8ObqSxsKgebysGmcsiisjh3ObC6ZgUfHR0NX1/NmCtNdT3p+LWpHGwqB5vKIYvKwqZyKPy6Xj30uWDhVa9evVC3yS/Kmw9aVyoLm8rBpnKwqRyyqCzyLgf1zJfuup50/NpUDjaVg03lkEVlYVM5FF5dryZ+ERERERERETekgF5ERERERETEDSmgL2JBQUEYN26cufV2KgubysGmcrCpHLKoLGwqB/ek782mcrCpHGwqhywqC5vKofDLQUnxRERERERERNyQeuhFRERERERE3JACehERERERERE3pIBeRERERERExA0poBcRERERERFxQwroi9hbb72FWrVqoUyZMmjVqhXWrFkDbzJ+/Hj4+PhkWxo0aABv8NNPP6F79+6Ijo42n3v+/PnZnmc+yrFjx6Jq1aooW7YsOnbsiN27d8PbyqFv375nHSM33XQTPM3EiRPRsmVLhIWFISoqCrfddht27dqV7TXJyckYOnQoKlasiNDQUPTq1QuHDh2Ct5XDDTfccNYxMWjQIHiSadOmoWnTpggPDzdL69atsXDhQq86FjyJ6nrV9arrVdeT6nqb6vriresV0Behzz77DI899pi5JMGGDRvQrFkzdOnSBXFxcfAmjRs3RkxMjHP55Zdf4A0SExPNd84TvdxMnjwZr7/+Ot555x389ttvCAkJMccH/3N7UzkQK3XXY2TWrFnwNCtWrDA/2qtXr8aiRYuQlpaGzp07m/JxePTRR/HNN99gzpw55vUHDx7E7bffDm8rBxowYEC2Y4L/XzxJ9erVMWnSJKxfvx7r1q1D+/bt0aNHD2zbts1rjgVPobreprpedb3qetX1Dqrri7mu52XrpGhcffXV1tChQ53rGRkZVnR0tDVx4kTLW4wbN85q1qyZ5e34X23evHnO9czMTKtKlSrWlClTnI+dOHHCCgoKsmbNmmV5SzlQnz59rB49eljeJi4uzpTHihUrnN9/QECANWfOHOdrduzYYV6zatUqy1vKgdq1a2cNHz7c8jbly5e33n//fa89FtyV6nrV9Q6q622q67Oorrepri/aul499EUkNTXVtMZwaJWDr6+vWV+1ahW8CYeWcQhW7dq1cd9992H//v3wdn/99RdiY2OzHR/lypUzQzW97fig5cuXmyFZ9evXx+DBg3H06FF4upMnT5rbChUqmFv+XrAF2/WY4JDVGjVqePQxkbMcHD799FNERkaiSZMmGDVqFJKSkuCpMjIyMHv2bNNzweF43nosuCPV9VlU159NdX12qutV16uun10kdb1/EeyvADhy5Ij54ipXrpztca7v3LkT3oKV1syZM82PN4fSTJgwAW3btsXWrVvNvBpvxQqecjs+HM95Cw7B4/CiSy+9FH/++SdGjx6Nrl27mh8zPz8/eKLMzEw88sgjuPbaa00lRvzeAwMDERER4TXHRG7lQPfeey9q1qxpgoPNmzfjiSeeMHPvvvzyS3iSLVu2mEqdQ285d27evHlo1KgRNm7c6HXHgrtSXW9TXZ871fVZVNerrlddn1xkdb0CeilS/LF2YFIIVvr8z/v555+jf//+JbpvUjr07t3bef/yyy83x8lll11mWvI7dOgAT8R5ZTzR9ZY5pgUth4EDB2Y7JphMiscCTwJ5bHgKBj+s0NlzMXfuXPTp08fMoRNxN6rr5XxU13sv1fX1i7yu15D7IsLhI2xxzJmpkOtVqlSBt2IrVL169bBnzx54M8cxoOPjbByuyf8/nnqMDBs2DN9++y2WLVtmkqU48Hvn8N0TJ054xTGRVznkhsEBedoxwZb5OnXqoHnz5iYjMBNKvfbaa153LLgz1fW5U11vU12fN9X13vH7rroexVLXK6Avwi+PX9ySJUuyDTnhOoddeKuEhATT8sZWOG/GIWf8z+p6fJw6dcpkwPXm44MOHDhg5tV52jHCPEGs2DjUaunSpeYYcMXfi4CAgGzHBIeecR6qJx0T5yuH3LBlmzztmMiJdURKSorXHAueQHV97lTX21TX5011vWf/vquuL+a6vkAp9KRAZs+ebTKZzpw509q+fbs1cOBAKyIiwoqNjbW8xb/+9S9r+fLl1l9//WWtXLnS6tixoxUZGWmyXXq6+Ph46/fffzcL/6tNnTrV3N+3b595ftKkSeZ4+Oqrr6zNmzeb7K+XXnqpdfr0actbyoHPjRgxwmTz5DGyePFi66qrrrLq1q1rJScnW55k8ODBVrly5cz/h5iYGOeSlJTkfM2gQYOsGjVqWEuXLrXWrVtntW7d2izeVA579uyxnnnmGfP5eUzw/0ft2rWt66+/3vIkTz75pMn2y8/I//9c9/HxsX788UevORY8hep61fWq61XXO6iut6muL966XgF9EXvjjTfMFxUYGGgubbN69WrLm9x9991W1apVzeevVq2aWed/Ym+wbNkyU6nlXHjpFsflbMaMGWNVrlzZnAx26NDB2rVrl+VN5cAf9s6dO1uVKlUyl+6oWbOmNWDAAI88Ec6tDLjMmDHD+Rqe4A0ZMsRc0iQ4ONjq2bOnqQC9qRz2799vKvQKFSqY/xd16tSxRo4caZ08edLyJA899JA53vnbyOOf//8dFby3HAueRHW96nrV9arrSXW9TXV98db1PvynYH36IiIiIiIiIlLSNIdeRERERERExA0poBcRERERERFxQwroRURERERERNyQAnoRERERERERN6SAXkRERERERMQNKaAXERERERERcUMK6EVERERERETckAJ6ERERERERETekgF5ESgUfHx/Mnz+/pHdDREREiojqepHCp4BeRNC3b19TyeZcbrrpppLeNRERESkEqutFPJN/Se+AiJQOrNBnzJiR7bGgoKAS2x8REREpXKrrRTyPeuhFxFmhV6lSJdtSvnx58xxb8KdNm4auXbuibNmyqF27NubOnZvt77ds2YL27dub5ytWrIiBAwciISEh22s+/PBDNG7c2LxX1apVMWzYsGzPHzlyBD179kRwcDDq1q2Lr7/+2vnc8ePHcd9996FSpUrmPfh8zpMSERERyZvqehHPo4BeRPJlzJgx6NWrFzZt2mQq2969e2PHjh3mucTERHTp0sWcFKxduxZz5szB4sWLs1XiPEkYOnSoqfx5QsAKvE6dOtneY8KECbjrrruwefNm3HzzzeZ9jh075nz/7du3Y+HCheZ9ub3IyMhiLgURERHPpbpexA1ZIuL1+vTpY/n5+VkhISHZlueff948z5+KQYMGZfubVq1aWYMHDzb3p0+fbpUvX95KSEhwPv/dd99Zvr6+VmxsrFmPjo62nnrqqTz3ge/x9NNPO9e5LT62cOFCs969e3erX79+hfzJRUREvIPqehHPpDn0ImLceOONpiXcVYUKFZz3W7dune05rm/cuNHcZyt6s2bNEBIS4nz+2muvRWZmJnbt2mWG8R08eBAdOnQ45z40bdrUeZ/bCg8PR1xcnFkfPHiw6TXYsGEDOnfujNtuuw1t2rS5yE8tIiLiPVTXi3geBfQi4qxUcw6LKyycB5cfAQEB2dZ5csATBeKcvn379mHBggVYtGiROWHgsL6XXnqpSPZZRETE06iuF/E8mkMvIvmyevXqs9YbNmxo7vOW8+04v85h5cqV8PX1Rf369REWFoZatWphyZIlF7UPTJLTp08ffPLJJ3j11Vcxffr0i9qeiIiIZFFdL+J+1EMvIkZKSgpiY2OzPebv7+9MRsPkNy1atMB1112HTz/9FGvWrMEHH3xgnmNCm3HjxpkKePz48Th8+DAefvhhPPDAA6hcubJ5DR8fNGgQoqKiTAt8fHy8ORHg6/Jj7NixaN68ucmcy3399ttvnScZIiIicn6q60U8jwJ6ETG+//57c3kZV2xx37lzpzMr7ezZszFkyBDzulmzZqFRo0bmOV565ocffsDw4cPRsmVLs845cFOnTnVuiycAycnJeOWVVzBixAhz8nDHHXfke/8CAwMxatQo7N271wzra9u2rdkfERERyR/V9SKex4eZ8Up6J0SkdOP8tnnz5pnkNCIiIuJ5VNeLuCfNoRcRERERERFxQwroRURERERERNyQhtyLiIiIiIiIuCH10IuIiIiIiIi4IQX0IiIiIiIiIm5IAb2IiIiIiIiIG1JALyIiIiIiIuKGFNCLiIiIiIiIuCEF9CIiIiIiIiJuSAG9iIiIiIiIiBtSQC8iIiIiIiIC9/P/CDS1AHdo3mEAAAAASUVORK5CYII=",
      "text/plain": [
       "<Figure size 1200x500 with 2 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAA+wAAAHWCAYAAADtpwNqAAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjEwLjMsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvZiW1igAAAAlwSFlzAAAPYQAAD2EBqD+naQAAvVNJREFUeJzs3Qd4U+XbBvC7SZvuFmjLHmUv2XvIEAQFEXChoiAqThy4UQTFwd+FKCIoigNFcAD6KYKAILL3kL0pq4PRPZN81/OeJm3atHRktb1/13XMaJKehtqT57zP8DKbzWYQERERERERkUfRuXsHiIiIiIiIiCg/BuxEREREREREHogBOxEREREREZEHYsBORERERERE5IEYsBMRERERERF5IAbsRERERERERB6IATsRERERERGRB2LATkREREREROSBGLATEREREREReSAG7EQe6LXXXoOXl1eJnvv111+r5548eRJlgeyr/LxERESejMdmInIHBuzkVpYDmJ+fH86ePZvv63369ME111xToteeP38+pk+fnu/+qKgovP766+jcuTMqV66M8PBw9X1Wrlx51deMjIxU+3u1TX6uivxhJi4ursD376abbir19yno37ascdT7QUTkSDw2ly88NpeM0WhEzZo11Xv3559/unt3qALzdvcOEIn09HT873//w4wZMxz2mnLg+O+///D000/b3P/rr7/inXfewbBhwzB69GhkZWXh22+/xfXXX4+5c+dizJgxBb6mHIiSkpKst5cuXYoffvgBH374ofpwYdG9e/dS7fvEiRPx0ksvlei59957L+688074+vqiLEhNTYW3t7dD/m2JiMhxeGy2xWNzxTo2//333zh//rw6ofH999/jxhtvdPcuUQXFgJ08Qtu2bTFnzhxMmDBBnc10pr59++L06dM2B/FHHnlE7cOkSZMK/VAgHyRyu3DhgvpQIPfLH/SCJCcnIzAwsMj7KAfJ4h4oLfR6vdrKClnB8QTy4dBkMsFgMLh7V4iIPAKPzbZ4bK5Yx+bvvvsO7du3VyeQXn755WL/vrgKP7+Uf0yJJ48gfwgl9UjO5Bf1j2iHDh3g7++PKlWqqLPWkk5nIWl0f/zxB06dOmVNhbMctFu2bGnzgUDIGe9BgwbhzJkzSExMLNXPct999yEoKAjHjh1TrxkcHIyRI0eqr/3777+4/fbb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d6ywm0z20+I53o2IiMjjmc1mJGUwJZ6IiJyPAbura9jNRiDtis2X+jTRVt93n4lHbGK6O/aOiIiIiiglwwhzdtsZrrATEZEzMWB3FW8D4Btqt469aogfrqkVoq7/c5jj3YiIqGyZOXMmIiMj4efnhy5dumDLli2FPn769Olo2rQp/P39UadOHYwfPx5paWnWrxuNRrz66quoX7++ekzDhg3xxhtvqJVtT6pf13kB/j56d+8OERGVYwzY3TyL3eK67LT41UyLJyKiMmThwoV45plnMHnyZOzYsQNt2rTBwIEDERNj/3g2f/58vPTSS+rxBw4cwJdffqle4+WXX7Y+5p133sGsWbPwySefqMfI7XfffRczZsyAp4108/LycvfuEBFROcaA3S117PlX0fs00wL2tYdjkWW0rXEnIiLyVNOmTcPYsWMxZswYtGjRArNnz0ZAQADmzp1r9/EbNmxAjx49cPfdd6tV+QEDBuCuu+6yWZWXxwwdOhSDBw9Wj7ntttvU4662cu/qkW7Bfj7u3hUiIirnGLC7o1N8npR40aZ2JVQO8FFn7Xectq1xJyIi8kQZGRnYvn07+vfvb71Pp9Op2xs3brT7nO7du6vnWILv48ePY+nSpRg0aJDNY1atWoXDhw+r27t378a6detw4403Frgv6enpSEhIsNmcnRIf6Mt0eCIici52SnGlgLACA3a9zgu9m0Rgya5z+PtgDDrXr+L6/SMiIiqGuLg4VW9erVo1m/vl9sGDB+0+R1bW5Xk9e/ZUNelZWVl45JFHbFLiJWVeAu5mzZpBr9er7/HWW29h5MiRBe7L1KlT8frrr8PVKfFERETOxBV2D5jFbtE3Oy2e492IiKi8WrNmDd5++218+umnquZ90aJF+OOPP1RTOYsff/wR33//vap3l8d88803eP/999VlQSZMmID4+HjrFhUV5fSU+CCmxBMRkZPx1LCH1LCLXo0jVMfZgxcSce5KKmpW8nft/hERERVDeHi4WgGPjo62uV9uV69e3e5zpPv7vffeiwcffFDdbtWqFZKTk/HQQw/hlVdeUSn1zz//vFplv/POO62POXXqlFpFHz16tN3X9fX1VZsrWFLig5gST0RETsYVdg+pYReVAw1oV7eyur7mEMe7ERGRZzMYDOjQoYOqN7cwmUzqdrdu3ew+JyUlRQXluUnQLyxj2wp6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2siRI61Ro0bWtWtXe+ONN8K3fffdd3b99ddbq1at3GPo9tgPHQAAoHLEeiAxkbADsPvvv9+uuuoq+/zzz10wvfbaa23NmjXutv3799ull17qgv4nn3xiM2fOtLlz50YFaX0ImDBhggvuCvgK0F26dIl6jIceesiuueYaW7lypQ0fPtw9zrfffht+/NWrV9ucOXPc4+r+WrZsWcutAABA4iLWA/WUByChjR492mvQoIHXuHHjqOORRx5xt+ttYNy4cVH/59xzz/Xy8vLc988995yXnZ3t7du3L3z77NmzveTkZG/btm3uck5OjnffffdV+hz0GL/61a/Cl3Vfum7OnDnu8uWXX+795Cc/qebfHACAYCDWA4mLNexAAPzoRz9yPdmRmjdvHv5+wIABUbfp8ooVK9z36gXv27evNW7cOHz7wIEDrayszNatW+em2W3ZssUGDx581OdwxhlnhL/XfTVt2tQKCgrc5by8PNfrv3z5chsyZIhdeeWVdt55553kbw0AQHAQ64HERMIOBICCZuy0teqidWhVkZqaGnVZwV8fBERr6vLz8+3tt9+2999/330g0LS7J554okaeMwAAiYZYDyQm1rADsCVLlhxxuUePHu57fdV6N61vC1m8eLElJydbt27dLDMz0zp27Gjz5s07qeegIjSjR4+2l19+2X7/+9/bc889d1L3BwAAyhHrgfqJEXYgAIqKimzbtm1R16WkpISLvai4zFlnnWXnn3++TZs2zZYuXWpTp051t6lgzOTJk12AffDBB23Hjh12++2324033mht2rRxP6Prx40bZ61bt3Y96Hv37nWBXj9XFQ888ID179/fVZ7Vc33rrbfCHyIAAMCxEeuBxETCDgTAO++847ZfiaQe87Vr14arus6YMcPGjx/vfm769OnWs2dPd5u2Znn33XftjjvusLPPPttd1hq0KVOmhO9LAb6wsNCefPJJmzRpkvtwcPXVV1f5+aWlpdk999xjX3/9tZt2N2jQIPd8AABA1RDrgcSUpMpzdf0kANQdrS+bNWuWK/4CAAASD7EeqL9Yww4AAAAAQBwiYQcAAAAAIA4xJR4AAAAAgDjECDsAAAAAAHGIhB0AAAAAgDhEwg4AAAAAQBwiYQcAAAAAIA6RsAMAAAAAEIdI2AEAAAAAiEMk7AAAAAAAxCESdgAAAAAALP78P55xxec2deWjAAAAAElFTkSuQmCC",
      "text/plain": [
       "<Figure size 1200x500 with 2 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "import matplotlib.pyplot as plt\n",
    "\n",
    "def plot_training_history(history, title=\"Model Training History\"):\n",
    "    \"\"\"\n",
    "    绘制训练与验证的损失和准确率曲线\n",
    "    \"\"\"\n",
    "    plt.figure(figsize=(12, 5))\n",
    "\n",
    "    # 损失曲线\n",
    "    plt.subplot(1, 2, 1)\n",
    "    plt.plot(history.history['loss'], label='Train Loss')\n",
    "    plt.plot(history.history['val_loss'], label='Validation Loss')\n",
    "    plt.title(f'{title} - Loss')\n",
    "    plt.xlabel('Epochs')\n",
    "    plt.ylabel('Loss')\n",
    "    plt.legend()\n",
    "\n",
    "    # 准确率曲线\n",
    "    plt.subplot(1, 2, 2)\n",
    "    plt.plot(history.history['accuracy'], label='Train Accuracy')\n",
    "    plt.plot(history.history['val_accuracy'], label='Validation Accuracy')\n",
    "    plt.title(f'{title} - Accuracy')\n",
    "    plt.xlabel('Epochs')\n",
    "    plt.ylabel('Accuracy')\n",
    "    plt.legend()\n",
    "\n",
    "    plt.show()\n",
    "\n",
    "# 绘制训练曲线\n",
    "plot_training_history(history1, title=\"Net1 Training History\")\n",
    "plot_training_history(history2, title=\"Net2 Training History\")\n",
    "##plot_training_history(history3, title=\"Net3 Training History\")"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 软投票融合 + 阈值法"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 29,
   "metadata": {
    "execution": {
     "iopub.execute_input": "2025-01-01T03:33:54.847669Z",
     "iopub.status.busy": "2025-01-01T03:33:54.847348Z",
     "iopub.status.idle": "2025-01-01T03:34:00.453855Z",
     "shell.execute_reply": "2025-01-01T03:34:00.453198Z",
     "shell.execute_reply.started": "2025-01-01T03:33:54.847638Z"
    },
    "trusted": true
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "\u001b[1m625/625\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m5s\u001b[0m 7ms/step\n",
      "\u001b[1m625/625\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m6s\u001b[0m 9ms/step\n",
      "\u001b[1m625/625\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m9s\u001b[0m 15ms/step\n"
     ]
    }
   ],
   "source": [
    "predictions1 = model1.predict(X_test)\n",
    "predictions2 = model2.predict(X_test)\n",
    "predictions3 = model3.predict(X_test)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 30,
   "metadata": {
    "execution": {
     "iopub.execute_input": "2025-01-01T03:34:00.455160Z",
     "iopub.status.busy": "2025-01-01T03:34:00.454862Z",
     "iopub.status.idle": "2025-01-01T03:34:00.460853Z",
     "shell.execute_reply": "2025-01-01T03:34:00.460087Z",
     "shell.execute_reply.started": "2025-01-01T03:34:00.455137Z"
    },
    "trusted": true
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[1.00000000e+00, 1.14398116e-10, 1.06334261e-10, 1.53321886e-11],\n",
       "       [1.00966587e-04, 1.66467580e-05, 9.99882340e-01, 2.30136088e-08],\n",
       "       [4.23955413e-08, 2.82347442e-13, 4.52315192e-07, 9.99999523e-01],\n",
       "       [9.99997497e-01, 1.31472746e-07, 2.38930852e-06, 2.02927689e-10],\n",
       "       [9.99999940e-01, 5.97923655e-10, 7.09642620e-08, 3.46923490e-10]],\n",
       "      dtype=float32)"
      ]
     },
     "execution_count": 30,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 平均融合预测结果\n",
    "predictions_weighted = 0.31 * predictions1 + 0.36 * predictions2 + 0.33* predictions3\n",
    "predictions_weighted[:5]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 31,
   "metadata": {
    "execution": {
     "iopub.execute_input": "2025-01-01T03:34:00.462063Z",
     "iopub.status.busy": "2025-01-01T03:34:00.461743Z",
     "iopub.status.idle": "2025-01-01T03:34:00.484914Z",
     "shell.execute_reply": "2025-01-01T03:34:00.484195Z",
     "shell.execute_reply.started": "2025-01-01T03:34:00.462034Z"
    },
    "trusted": true
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>id</th>\n",
       "      <th>label_0</th>\n",
       "      <th>label_1</th>\n",
       "      <th>label_2</th>\n",
       "      <th>label_3</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>100000</td>\n",
       "      <td>1.000000e+00</td>\n",
       "      <td>1.143981e-10</td>\n",
       "      <td>1.063343e-10</td>\n",
       "      <td>1.533219e-11</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>100001</td>\n",
       "      <td>1.009666e-04</td>\n",
       "      <td>1.664676e-05</td>\n",
       "      <td>9.998823e-01</td>\n",
       "      <td>2.301361e-08</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>100002</td>\n",
       "      <td>4.239554e-08</td>\n",
       "      <td>2.823474e-13</td>\n",
       "      <td>4.523152e-07</td>\n",
       "      <td>9.999995e-01</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>100003</td>\n",
       "      <td>9.999975e-01</td>\n",
       "      <td>1.314727e-07</td>\n",
       "      <td>2.389309e-06</td>\n",
       "      <td>2.029277e-10</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>100004</td>\n",
       "      <td>9.999999e-01</td>\n",
       "      <td>5.979237e-10</td>\n",
       "      <td>7.096426e-08</td>\n",
       "      <td>3.469235e-10</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "       id       label_0       label_1       label_2       label_3\n",
       "0  100000  1.000000e+00  1.143981e-10  1.063343e-10  1.533219e-11\n",
       "1  100001  1.009666e-04  1.664676e-05  9.998823e-01  2.301361e-08\n",
       "2  100002  4.239554e-08  2.823474e-13  4.523152e-07  9.999995e-01\n",
       "3  100003  9.999975e-01  1.314727e-07  2.389309e-06  2.029277e-10\n",
       "4  100004  9.999999e-01  5.979237e-10  7.096426e-08  3.469235e-10"
      ]
     },
     "execution_count": 31,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 准备提交结果\n",
    "submit = pd.DataFrame()\n",
    "submit['id'] = range(100000, 120000)\n",
    "submit['label_0'] = predictions_weighted[:, 0]\n",
    "submit['label_1'] = predictions_weighted[:, 1]\n",
    "submit['label_2'] = predictions_weighted[:, 2]\n",
    "submit['label_3'] = predictions_weighted[:, 3]\n",
    "submit.head()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 32,
   "metadata": {
    "execution": {
     "iopub.execute_input": "2025-01-01T03:34:00.485783Z",
     "iopub.status.busy": "2025-01-01T03:34:00.485536Z",
     "iopub.status.idle": "2025-01-01T03:34:11.159442Z",
     "shell.execute_reply": "2025-01-01T03:34:11.158585Z",
     "shell.execute_reply.started": "2025-01-01T03:34:00.485764Z"
    },
    "trusted": true
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "2331 id         102331.000000\n",
      "label_0         0.405956\n",
      "label_1         0.303937\n",
      "label_2         0.286193\n",
      "label_3         0.003914\n",
      "Name: 2331, dtype: float64\n",
      "8921 id         108921.000000\n",
      "label_0         0.495531\n",
      "label_1         0.100462\n",
      "label_2         0.403244\n",
      "label_3         0.000763\n",
      "Name: 8921, dtype: float64\n",
      "9349 id         109349.000000\n",
      "label_0         0.337329\n",
      "label_1         0.360173\n",
      "label_2         0.000014\n",
      "label_3         0.302484\n",
      "Name: 9349, dtype: float64\n",
      "10455 id         110455.000000\n",
      "label_0         0.310260\n",
      "label_1         0.000034\n",
      "label_2         0.326701\n",
      "label_3         0.363006\n",
      "Name: 10455, dtype: float64\n",
      "13851 id         113851.000000\n",
      "label_0         0.477260\n",
      "label_1         0.023513\n",
      "label_2         0.494402\n",
      "label_3         0.004825\n",
      "Name: 13851, dtype: float64\n",
      "14000 id         114000.000000\n",
      "label_0         0.334437\n",
      "label_1         0.030599\n",
      "label_2         0.457326\n",
      "label_3         0.177638\n",
      "Name: 14000, dtype: float64\n",
      "14781 id         114781.000000\n",
      "label_0         0.446358\n",
      "label_1         0.068003\n",
      "label_2         0.485623\n",
      "label_3         0.000016\n",
      "Name: 14781, dtype: float64\n",
      "16320 id         116320.000000\n",
      "label_0         0.333782\n",
      "label_1         0.298556\n",
      "label_2         0.367648\n",
      "label_3         0.000014\n",
      "Name: 16320, dtype: float64\n",
      "17665 id         1.176650e+05\n",
      "label_0    4.390340e-01\n",
      "label_1    2.354091e-01\n",
      "label_2    3.255570e-01\n",
      "label_3    3.905197e-10\n",
      "Name: 17665, dtype: float64\n",
      "18635 id         118635.000000\n",
      "label_0         0.417590\n",
      "label_1         0.000003\n",
      "label_2         0.227723\n",
      "label_3         0.354684\n",
      "Name: 18635, dtype: float64\n",
      "18850 id         118850.000000\n",
      "label_0         0.395045\n",
      "label_1         0.005588\n",
      "label_2         0.413247\n",
      "label_3         0.186120\n",
      "Name: 18850, dtype: float64\n",
      "19458 id         119458.000000\n",
      "label_0         0.363733\n",
      "label_1         0.348645\n",
      "label_2         0.287620\n",
      "label_3         0.000002\n",
      "Name: 19458, dtype: float64\n"
     ]
    },
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>id</th>\n",
       "      <th>label_0</th>\n",
       "      <th>label_1</th>\n",
       "      <th>label_2</th>\n",
       "      <th>label_3</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>100000</td>\n",
       "      <td>1.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>100001</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>1.0</td>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>100002</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>1.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>100003</td>\n",
       "      <td>1.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>100004</td>\n",
       "      <td>1.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "       id  label_0  label_1  label_2  label_3\n",
       "0  100000      1.0      0.0      0.0      0.0\n",
       "1  100001      0.0      0.0      1.0      0.0\n",
       "2  100002      0.0      0.0      0.0      1.0\n",
       "3  100003      1.0      0.0      0.0      0.0\n",
       "4  100004      1.0      0.0      0.0      0.0"
      ]
     },
     "execution_count": 32,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 第一次后处理未涉及的难样本 index\n",
    "others = []\n",
    "\n",
    "# 第一次后处理 - 将预测概率值大于 0.5 的样本的概率置 1，其余置 0\n",
    "threshold = 0.5  \n",
    "for index, row in submit.iterrows():\n",
    "    row_max = max(list(row[1:]))  # 当前行中的最大类别概率预测值\n",
    "    if row_max > threshold:\n",
    "        for i in range(1, 5):\n",
    "            if row[i] > threshold:\n",
    "                submit.iloc[index, i] = 1  # 大于 0.5 的类别概率预测值置 1\n",
    "            else:\n",
    "                submit.iloc[index, i] = 0  # 其余类别概率预测值置 0\n",
    "    else:\n",
    "        others.append(index)  # 否则，没有类别概率预测值不小于 0.5，加入第一次后处理未涉及的难样本列表，等待第二次后处理\n",
    "        print(index, row)\n",
    "                \n",
    "submit.head(5)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 33,
   "metadata": {
    "execution": {
     "iopub.execute_input": "2025-01-01T03:34:11.160406Z",
     "iopub.status.busy": "2025-01-01T03:34:11.160202Z",
     "iopub.status.idle": "2025-01-01T03:34:18.198048Z",
     "shell.execute_reply": "2025-01-01T03:34:18.197393Z",
     "shell.execute_reply.started": "2025-01-01T03:34:11.160389Z"
    },
    "trusted": true
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "id         102331.0\n",
      "label_0         1.0\n",
      "label_1         0.0\n",
      "label_2         0.0\n",
      "label_3         0.0\n",
      "Name: 2331, dtype: float64\n",
      "id         108921.0\n",
      "label_0         1.0\n",
      "label_1         0.0\n",
      "label_2         0.0\n",
      "label_3         0.0\n",
      "Name: 8921, dtype: float64\n",
      "id         109349.000000\n",
      "label_0         0.337329\n",
      "label_1         0.360173\n",
      "label_2         0.000000\n",
      "label_3         0.000000\n",
      "Name: 9349, dtype: float64\n",
      "id         110455.000000\n",
      "label_0         0.000000\n",
      "label_1         0.000000\n",
      "label_2         0.326701\n",
      "label_3         0.363006\n",
      "Name: 10455, dtype: float64\n",
      "id         113851.000000\n",
      "label_0         0.477260\n",
      "label_1         0.000000\n",
      "label_2         0.494402\n",
      "label_3         0.000000\n",
      "Name: 13851, dtype: float64\n",
      "id         114000.0\n",
      "label_0         0.0\n",
      "label_1         0.0\n",
      "label_2         1.0\n",
      "label_3         0.0\n",
      "Name: 14000, dtype: float64\n",
      "id         114781.000000\n",
      "label_0         0.446358\n",
      "label_1         0.000000\n",
      "label_2         0.485623\n",
      "label_3         0.000000\n",
      "Name: 14781, dtype: float64\n",
      "id         116320.000000\n",
      "label_0         0.333782\n",
      "label_1         0.000000\n",
      "label_2         0.367648\n",
      "label_3         0.000000\n",
      "Name: 16320, dtype: float64\n",
      "id         117665.0\n",
      "label_0         1.0\n",
      "label_1         0.0\n",
      "label_2         0.0\n",
      "label_3         0.0\n",
      "Name: 17665, dtype: float64\n",
      "id         118635.0\n",
      "label_0         1.0\n",
      "label_1         0.0\n",
      "label_2         0.0\n",
      "label_3         0.0\n",
      "Name: 18635, dtype: float64\n",
      "id         118850.000000\n",
      "label_0         0.395045\n",
      "label_1         0.000000\n",
      "label_2         0.413247\n",
      "label_3         0.000000\n",
      "Name: 18850, dtype: float64\n",
      "id         119458.000000\n",
      "label_0         0.363733\n",
      "label_1         0.348645\n",
      "label_2         0.000000\n",
      "label_3         0.000000\n",
      "Name: 19458, dtype: float64\n"
     ]
    }
   ],
   "source": [
    "# 第二次后处理 - 在预测概率值均不大于 0.5 的样本中，若最大预测值与次大预测值相差大于 0.04，则将最大预测值置 1，其余预测值置 0；\n",
    "#                否则，对最大预测值和次大预测值不处理 (难分类)，仅对其余样本预测值置 0\n",
    "for idx in others:\n",
    "    value = submit.iloc[idx].values[1:]\n",
    "    ordered_value = sorted([(v, j) for j, v in enumerate(value)], reverse=True)  # 根据类别概率预测值大小排序\n",
    "    #print(ordered_value)\n",
    "    if ordered_value[0][0] - ordered_value[1][0] >= 0.04:  # 最大与次大值相差至少 0.04\n",
    "        submit.iloc[idx, ordered_value[0][1]+1] = 1  # 则足够置信最大概率预测值并置为 1\n",
    "        for k in range(1, 4):\n",
    "            submit.iloc[idx, ordered_value[k][1]+1] = 0  # 对非最大的其余三个类别概率预测值置 0\n",
    "    else:\n",
    "        for s in range(2, 4):\n",
    "            submit.iloc[idx, ordered_value[s][1]+1] = 0  # 难分样本，仅对最小的两个类别概率预测值置 0        \n",
    "        \n",
    "    print(submit.iloc[idx])   "
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 保存结果"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 34,
   "metadata": {
    "execution": {
     "iopub.execute_input": "2025-01-01T03:34:18.199110Z",
     "iopub.status.busy": "2025-01-01T03:34:18.198824Z",
     "iopub.status.idle": "2025-01-01T03:34:18.246939Z",
     "shell.execute_reply": "2025-01-01T03:34:18.246316Z",
     "shell.execute_reply.started": "2025-01-01T03:34:18.199078Z"
    },
    "trusted": true
   },
   "outputs": [],
   "source": [
    "# 检视最后的预测结果\n",
    "submit.head()\n",
    "# 保存预测结果\n",
    "submit.to_csv((\"submit_\"+datetime.datetime.now().strftime('%Y%m%d_%H%M%S') + \".csv\"), index=False) "
   ]
  }
 ],
 "metadata": {
  "kaggle": {
   "accelerator": "gpu",
   "dataSources": [
    {
     "datasetId": 6382021,
     "sourceId": 10309702,
     "sourceType": "datasetVersion"
    }
   ],
   "dockerImageVersionId": 30823,
   "isGpuEnabled": true,
   "isInternetEnabled": true,
   "language": "python",
   "sourceType": "notebook"
  },
  "kernelspec": {
   "display_name": ".venv",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.11.9"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 4
}
